fix: properly escape JSON string values (newlines, control chars)
Build & Deploy / build-and-deploy (push) Successful in 41s

escapeJsonValue only escaped backslash and double-quote, but the
autoexec script contains literal newlines which are invalid in JSON
strings. Now escapes \n, \r, \t and all control characters < 0x20.

Fixes JSON.parse error in Theme Hospital: 'bad character in string literal'
This commit is contained in:
Hermes Agent
2026-06-03 17:05:25 +02:00
parent 27b28430a5
commit 6e64793a2d
2 changed files with 38 additions and 4 deletions
+18 -1
View File
@@ -299,7 +299,24 @@ public class GameService {
}
private static String escapeJsonValue(String s) {
return s.replace("\\", "\\\\").replace("\"", "\\\"");
StringBuilder sb = new StringBuilder(s.length());
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '\\': sb.append("\\\\"); break;
case '"': sb.append("\\\""); break;
case '\n': sb.append("\\n"); break;
case '\r': sb.append("\\r"); break;
case '\t': sb.append("\\t"); break;
default:
if (c < 0x20) {
sb.append(String.format("\\u%04x", (int) c));
} else {
sb.append(c);
}
}
}
return sb.toString();
}
/** Quick platform detection for a given executable inside a .jsdos bundle. */
@@ -623,7 +623,7 @@ public class UploadResource {
script.append(parts[1]);
String json = "{"
+ "\"autoexec\":{"
+ "\"options\":{\"script\":{\"value\":\"" + escapeJson(script.toString()) + "\"}}"
+ "\"options\":{\"script\":{\"value\":\"" + escapeJsonValue(script.toString()) + "\"}}"
+ "},"
+ "\"output\":{"
+ "\"options\":{\"autolock\":{\"value\":true}}}"
@@ -762,8 +762,25 @@ public class UploadResource {
return sb.toString();
}
private String escapeJson(String s) {
return s.replace("\\", "\\\\").replace("\"", "\\\"");
private static String escapeJsonValue(String s) {
StringBuilder sb = new StringBuilder(s.length());
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '\\': sb.append("\\\\"); break;
case '"': sb.append("\\\""); break;
case '\n': sb.append("\\n"); break;
case '\r': sb.append("\\r"); break;
case '\t': sb.append("\\t"); break;
default:
if (c < 0x20) {
sb.append(String.format("\\u%04x", (int) c));
} else {
sb.append(c);
}
}
}
return sb.toString();
}
/**