From bacde1cedeff76988fa70450e74a353476591c09 Mon Sep 17 00:00:00 2001 From: "niccolo.piazzesi" Date: Fri, 13 Dec 2024 09:55:49 +0100 Subject: [PATCH] Limit size of strings to 65535 bytes --- base/src/main/java/proguard/ProGuard.java | 7 ++++++ .../proguard/normalize/StringNormalizer.java | 22 +++++++++++++++++++ docs/md/manual/releasenotes.md | 7 ++++++ 3 files changed, 36 insertions(+) create mode 100644 base/src/main/java/proguard/normalize/StringNormalizer.java diff --git a/base/src/main/java/proguard/ProGuard.java b/base/src/main/java/proguard/ProGuard.java index 8ce5ce68..aa03456d 100644 --- a/base/src/main/java/proguard/ProGuard.java +++ b/base/src/main/java/proguard/ProGuard.java @@ -31,6 +31,7 @@ import proguard.configuration.InitialStateInfo; import proguard.evaluation.IncompleteClassHierarchyException; import proguard.logging.Logging; import proguard.mark.Marker; +import proguard.normalize.StringNormalizer; import proguard.obfuscate.NameObfuscationReferenceFixer; import proguard.obfuscate.ObfuscationPreparation; import proguard.obfuscate.Obfuscator; @@ -219,6 +220,7 @@ public class ProGuard configuration.obfuscate) { expandPrimitiveArrayConstants(); + normalizeStrings(); } if (configuration.targetClassVersion != 0) @@ -269,6 +271,11 @@ public class ProGuard } } + private void normalizeStrings() throws Exception { + passRunner.run(new StringNormalizer(),appView); + + } + /** * Checks the GPL. diff --git a/base/src/main/java/proguard/normalize/StringNormalizer.java b/base/src/main/java/proguard/normalize/StringNormalizer.java new file mode 100644 index 00000000..e65b21e6 --- /dev/null +++ b/base/src/main/java/proguard/normalize/StringNormalizer.java @@ -0,0 +1,22 @@ +package proguard.normalize; + +import proguard.AppView; +import proguard.classfile.visitor.ParallelAllClassVisitor; +import proguard.pass.Pass; +import proguard.pass.PassId; + +/** + * Ensures all strings are at most 65535 bytes in length, when encoded as modified UTF-8. + * + * @see LargeStringSplitter + */ +public class StringNormalizer implements Pass { + + + @Override + public void execute(AppView appView) throws Exception { + appView.programClassPool.accept( + new ParallelAllClassVisitor( + () -> new LargeStringSplitter(appView.programClassPool, appView.libraryClassPool))); + } +} diff --git a/docs/md/manual/releasenotes.md b/docs/md/manual/releasenotes.md index 04296e45..d15f0e3e 100644 --- a/docs/md/manual/releasenotes.md +++ b/docs/md/manual/releasenotes.md @@ -1,3 +1,10 @@ + +## Version 7.6.2 + +### Bugfixes + +- Prevent `IllegalArgumentException` when strings longer than 65535 bytes are present in the application (#267). + ## Version 7.6.1 ### Bugfixes