Fix out of bound error in DescriptorUtils#getArgumentCount.
Change-Id: I5c8963fc720cd4fe0da685f7c6f57e9e5243ab63
diff --git a/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java b/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
index b532e50..51ab446 100644
--- a/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
@@ -639,7 +639,8 @@
break;
case '[':
startType = charIdx;
- while (methodDescriptor.charAt(++charIdx) == '[') {}
+ while (methodDescriptor.charAt(++charIdx) == '[')
+ ;
if (methodDescriptor.charAt(charIdx) == 'L') {
while (methodDescriptor.charAt(++charIdx) != ';')
;
@@ -661,19 +662,25 @@
}
public static int getArgumentCount(final String methodDescriptor) {
+ int length = methodDescriptor.length();
int charIdx = 1;
char c;
int argCount = 0;
- while (charIdx < methodDescriptor.length() && (c = methodDescriptor.charAt(charIdx++)) != ')') {
+ while (charIdx < length && (c = methodDescriptor.charAt(charIdx++)) != ')') {
if (c == 'L') {
- while (methodDescriptor.charAt(charIdx++) != ';')
+ while (charIdx < length && methodDescriptor.charAt(charIdx++) != ';')
;
+ // Check if the inner loop found ';' within the boundary.
+ if (charIdx >= length || methodDescriptor.charAt(charIdx - 1) != ';') {
+ throw new InvalidDescriptorException(methodDescriptor);
+ }
argCount++;
} else if (c != '[') {
argCount++;
}
}
- if (charIdx >= methodDescriptor.length() || methodDescriptor.charAt(charIdx - 1) != ')') {
+ // Check if the outer loop found ')' within the boundary.
+ if (charIdx >= length || methodDescriptor.charAt(charIdx - 1) != ')') {
throw new InvalidDescriptorException(methodDescriptor);
}
return argCount;