Add some additional JSON string escapes.
--
MOS_MIGRATED_REVID=115921810
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
index 19af953..339592e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
@@ -781,7 +781,7 @@
sb.append("]");
} else if (value instanceof String) {
sb.append("\"");
- sb.append(escapeString((String) value));
+ sb.append(jsonEscapeString((String) value));
sb.append("\"");
} else if (value instanceof Integer || value instanceof Boolean) {
sb.append(value);
@@ -794,6 +794,12 @@
throw new EvalException(loc, errorMessage);
}
}
+
+ private String jsonEscapeString(String string) {
+ return escapeString(string.replace("\\", "\\\\")
+ .replace("\r", "\\r")
+ .replace("\t", "\\t"));
+ }
};
@SkylarkSignature(name = "output_group",
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index dd2bcdc..cd02b77 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -599,7 +599,10 @@
public void testJsonEscapes() throws Exception {
checkJson("struct(name='a\"b').to_json()", "{\"name\":\"a\\\"b\"}");
checkJson("struct(name='a\\'b').to_json()", "{\"name\":\"a'b\"}");
+ checkJson("struct(name='a\\\\b').to_json()", "{\"name\":\"a\\\\b\"}");
checkJson("struct(name='a\\nb').to_json()", "{\"name\":\"a\\nb\"}");
+ checkJson("struct(name='a\\rb').to_json()", "{\"name\":\"a\\rb\"}");
+ checkJson("struct(name='a\\tb').to_json()", "{\"name\":\"a\\tb\"}");
}
@Test