diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d951050132..261bdd81a59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ ### 6.2.0 (2022-10-20) #### Bugs +* Fix #4535: The shell command string will now have single quotes sanitized * Fix #3733: The authentication command from the .kube/config won't be discarded if no arguments are specified * Fix #4312: fix timestamp can't be deserialized for IstioCondition * Fix #4369: Informers will retry with a backoff on list/watch failure as they did in 5.12 and prior. diff --git a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/core/v1/PodOperationsImpl.java b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/core/v1/PodOperationsImpl.java index dc0bcbe9106..923fabf5770 100644 --- a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/core/v1/PodOperationsImpl.java +++ b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/core/v1/PodOperationsImpl.java @@ -591,7 +591,7 @@ public BytesLimitTerminateTimeTailPrettyLoggable usingTimestamps() { } public static String shellQuote(String value) { - return "'" + value.replace("'", "'\\\\''") + "'"; + return "'" + value.replace("'", "\'\"\'\"\'") + "'"; } @Override diff --git a/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/dsl/internal/uploadable/PodUploadTest.java b/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/dsl/internal/uploadable/PodUploadTest.java index 68caa556676..b76c489c953 100644 --- a/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/dsl/internal/uploadable/PodUploadTest.java +++ b/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/dsl/internal/uploadable/PodUploadTest.java @@ -179,6 +179,26 @@ void createExecCommandForUpload_withNormalFile_shouldCreateValidExecCommandForUp assertThat(result, equalTo("mkdir -p '/tmp/foo' && base64 -d - > '/tmp/foo/cp.log'")); } + @Test + void createExecCommandForUpload_withSingleQuoteInPath() + { + // When + String result = PodUpload.createExecCommandForUpload("/tmp/fo'o/cp.log"); + + // Then + assertThat(result, equalTo("mkdir -p '/tmp/fo\'\"\'\"\'o' && base64 -d - > '/tmp/fo\'\"\'\"\'o/cp.log'")); + } + + @Test + void createExecCommandForUpload_withMultipleSingleQuotesInPath() + { + // When + String result = PodUpload.createExecCommandForUpload("/tmp/f'o'o/c'p.log"); + + // Then + assertThat(result, equalTo("mkdir -p '/tmp/f\'\"\'\"\'o\'\"\'\"\'o' && base64 -d - > '/tmp/f\'\"\'\"\'o\'\"\'\"\'o/c\'\"\'\"\'p.log'")); + } + void uploadFileAndVerify(PodUploadTester fileUploadMethodToTest) throws IOException, InterruptedException { this.operation = operation.file("/mock/dir/file"); WebSocket.Builder builder = Mockito.mock(WebSocket.Builder.class, Mockito.RETURNS_SELF);