fix: properly escape JSON string values (newlines, control chars)
Build & Deploy / build-and-deploy (push) Successful in 41s
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:
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user