Skip to content

Commit ce89f97

Browse files
committed
Escape newlines in single-instance argument passing
Arguments containing newlines are now properly escaped when sent over the wire protocol. Backslashes, newlines (\n), and carriage returns (\r) are escaped to prevent them from being interpreted as line separators in the one-arg-per-line protocol.
1 parent 8eb6e1a commit ce89f97

1 file changed

Lines changed: 24 additions & 2 deletions

File tree

src/main/java/org/scijava/launcher/SingleInstance.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ static boolean tryHandoff(String[] args) {
142142
lockFile.toFile().delete();
143143
return false;
144144
}
145-
for (String arg : args) out.println(arg);
145+
for (String arg : args) out.println(escapeNewlines(arg));
146146
}
147147
Log.debug("[SingleInstance] Args handed off to existing instance.");
148148
return true;
@@ -179,7 +179,7 @@ private static void handleConnection(Socket client, String secretGreeting, Strin
179179
out.println(secretResponse);
180180
List<String> args = new ArrayList<>();
181181
String line;
182-
while ((line = in.readLine()) != null) args.add(line);
182+
while ((line = in.readLine()) != null) args.add(unescapeNewlines(line));
183183
if (!args.isEmpty()) argReceiver.accept(args.toArray(new String[0]));
184184
}
185185
catch (IOException e) {
@@ -206,4 +206,26 @@ private static String toHex(byte[] bytes) {
206206
for (byte b : bytes) sb.append(String.format("%02x", b));
207207
return sb.toString();
208208
}
209+
210+
private static String escapeNewlines(String s) {
211+
return s.replace("\\", "\\\\").replace("\n", "\\n").replace("\r", "\\r");
212+
}
213+
214+
private static String unescapeNewlines(String s) {
215+
StringBuilder sb = new StringBuilder();
216+
for (int i = 0; i < s.length(); i++) {
217+
char c = s.charAt(i);
218+
if (c == '\\' && i + 1 < s.length()) {
219+
char next = s.charAt(i + 1);
220+
if (next == 'n') { sb.append('\n'); i++; }
221+
else if (next == 'r') { sb.append('\r'); i++; }
222+
else if (next == '\\') { sb.append('\\'); i++; }
223+
else sb.append(c);
224+
}
225+
else {
226+
sb.append(c);
227+
}
228+
}
229+
return sb.toString();
230+
}
209231
}

0 commit comments

Comments
 (0)