From a4ed6785527a4381e7ade0bae70de2ee0612da45 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 5 Apr 2017 13:50:56 -0700 Subject: [PATCH] Bug 513505. Escape arguments for CDT standalone. Change-Id: I2119321ea9c4227d23b30f9177889ee24a6b5bbb Signed-off-by: Brendan Dahl --- .../ApplicationWorkbenchWindowAdvisor.java | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/debug/org.eclipse.cdt.debug.application/src/org/eclipse/cdt/debug/application/ApplicationWorkbenchWindowAdvisor.java b/debug/org.eclipse.cdt.debug.application/src/org/eclipse/cdt/debug/application/ApplicationWorkbenchWindowAdvisor.java index effad6259cc..6480071ff31 100644 --- a/debug/org.eclipse.cdt.debug.application/src/org/eclipse/cdt/debug/application/ApplicationWorkbenchWindowAdvisor.java +++ b/debug/org.eclipse.cdt.debug.application/src/org/eclipse/cdt/debug/application/ApplicationWorkbenchWindowAdvisor.java @@ -130,6 +130,50 @@ public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { return result; } + private void appendChar(StringBuilder builder, int repeat, char c) { + for (int i = 0; i < repeat; i++) { + builder.append(c); + } + } + + private boolean needsEscaping(String input) { + for (int i = 0; i < input.length(); i++) { + char c = input.charAt(i); + if (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '"') { + return true; + } + } + return false; + } + + private String escapeArg(String arg) { + if (!arg.isEmpty() && !needsEscaping(arg)) { + return arg; + } + StringBuilder buffer = new StringBuilder(); + buffer.append('"'); + for (int i = 0; i < arg.length(); i++) { + int numberOfBackslashes = 0; + while (i < arg.length() && arg.charAt(i) == '\\') { + i++; + numberOfBackslashes++; + } + + if (i == arg.length()) { + appendChar(buffer, numberOfBackslashes * 2, '\\'); + break; + } else if (arg.charAt(i) == '"') { + appendChar(buffer, numberOfBackslashes * 2 + 1, '\\'); + buffer.append(arg.charAt(i)); + } else { + appendChar(buffer, numberOfBackslashes * 2, '\\'); + buffer.append(arg.charAt(i)); + } + } + buffer.append('"'); + return buffer.toString(); + } + public class PostWindowCreateRunnable implements IRunnableWithProgress { @Override @@ -198,10 +242,10 @@ public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { StringBuilder argBuffer = new StringBuilder(); // Remaining values are arguments to the executable if (i < args.length) - argBuffer.append(args[i++]); + argBuffer.append(escapeArg(args[i++])); while (i < args.length) { argBuffer.append(" "); //$NON-NLS-1$ - argBuffer.append(args[i++]); + argBuffer.append(escapeArg(args[i++])); } arguments = argBuffer.toString(); }