RFR: 8343437: ClassDesc.of incorrectly permitting empty names [v2]

Chen Liang liach at openjdk.org
Fri Nov 1 23:59:30 UTC 2024


On Fri, 1 Nov 2024 21:32:23 GMT, Mandy Chung <mchung at openjdk.org> wrote:

>> Chen Liang has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   Comments to clarify, also align skipOverFieldSignature
>
> src/java.base/share/classes/jdk/internal/constant/ConstantUtils.java line 258:
> 
>> 256:         if (name.isEmpty())
>> 257:             return name;
>> 258:         return validateBinaryClassName(name);
> 
> Perhaps have a utility method to specify if empty name is allowed.   `validateBinaryClassName` and `validateInternalClassName` only differ in the separator charactor.   They can be refactored to call one single name validation method something like this:
> 
> 
>     private static String validateName(String name, boolean internalName, boolean allowEmptyName) {
>         if (!allowEmptyName && name.isEmpty())
>               throw invalidClassName(name);
>               
>         // state variable for detection of illegal states, such as:
>         // empty unqualified name, consecutive, leading, or trailing separators
>         int afterSeparator = 0;
>         int len = name.length();
>         for (int i = 0; i < len; i++) {
>             char ch = name.charAt(i);
>             // reject ';' or '[' or other form's separator
>             if (ch == ';' || ch == '[' || (internalName && ch == '.') || (!internalName && ch == '/'))
>                 throw invalidClassName(name);
>             if ((internalName && ch == '/') || (!internalName && ch == '.')) {
>                 // illegal state when received separator indicates consecutive
>                 // or leading separators
>                 if (i == afterSeparator)
>                     throw invalidClassName(name);
>                 afterSeparator = i + 1;
>             }
>         }
>         // reject empty unqualified name or trailing separators
>         if (len == afterSeparator)
>             throw invalidClassName(name);
>         return name;
>     }

I assume I will still keep the 4 public methods to call this implementation method, as the boolean arguments will be otherwise confusing.  Is that what you intend?

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/21830#discussion_r1826385667


More information about the core-libs-dev mailing list