diff --git a/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java b/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java index ea1e1a11b55..4cfe1eea48c 100644 --- a/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java +++ b/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java @@ -1054,7 +1054,13 @@ public String[] javaAnnotations(JsonProperties props) { private static final String PATTERN_IDENTIFIER_PART = "\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*"; private static final String PATTERN_IDENTIFIER = String.format("(?:%s(?:\\.%s)*)", PATTERN_IDENTIFIER_PART, PATTERN_IDENTIFIER_PART); - private static final String PATTERN_STRING = "\"(?:\\\\[\\\\\"ntfb]|(? outputs = new SpecificCompiler(SchemaParser.parseSingle(jsonSchema)) + .compile(); + boolean validAnnotationEmitted = false; + for (SpecificCompiler.OutputFile outputFile : outputs) { + // The payload is echoed (safely escaped) inside the SCHEMA$ string constant, + // so we must distinguish that from a verbatim emission as code. Real injected + // code would carry unescaped quotes; the schema literal escapes them as \". + // The injection must be absent from every generated file. + assertFalse(outputFile.contents.contains("SuppressWarnings(\"x\") static { System.exit(1); }"), + "Code injection present? " + outputFile.contents); + validAnnotationEmitted |= outputFile.contents.contains("@SuppressWarnings(\"unchecked\")"); + } + // The legitimate annotation in the same list must still be emitted somewhere. + assertTrue(validAnnotationEmitted, "Valid annotation missing from generated output"); + } + private int countOccurrences(Pattern pattern, String textToSearch) { int count = 0; for (Matcher matcher = pattern.matcher(textToSearch); matcher.find();) {