RFR (S): 8243936: NonWriteable system properties are actually writeable

Daniel D. Daugherty daniel.daugherty at oracle.com
Wed May 27 14:44:55 UTC 2020


> Updated webrev:
>
> http://cr.openjdk.java.net/~dholmes/8243936/webrev.v2/ 

src/hotspot/share/runtime/arguments.hpp
     No comments.

src/hotspot/share/runtime/arguments.cpp
     L2210:          strcmp(prop_name, "jdk.module.illegalAccess") == 0, 
"unknown module property: %s", prop_name);
     L2229:   assert(is_internal_module_property(prop_base_name), 
"unknown module property: %s", prop_base_name);
         nit - for unknown string values, I like to use '%s' so that the
         leading and trailing parts of the unknown string are obvious.
         Imagine a trailing space in the property name.

test/hotspot/jtreg/runtime/NonWriteableProperty.java
     No comments.

Thumbs up. No need to see a new webrev if you decide to tweak the
assertion messages.

Thanks for listing the testing that you did.

Dan



On 5/22/20 1:12 AM, David Holmes wrote:
> On 22/05/2020 1:04 pm, David Holmes wrote:
>> Hi Ioi,
>>
>> Thanks for taking a look at this.
>>
>> On 22/05/2020 12:45 pm, Ioi Lam wrote:
>>> Hi David,
>>>
>>> This change reasonable to me. It took me a while to understand the 
>>> fix and the history behind it. I can see that the module properties 
>>> can be "writable" because they are checked in this function to 
>>> prevent them from being set via -D in the command-line.
>>>
>>> bool Arguments::is_internal_module_property(const char* property) {
>>>    assert((strncmp(property, "-D", 2) != 0), "Unexpected leading -D");
>>>    if  (strncmp(property, MODULE_PROPERTY_PREFIX, 
>>> MODULE_PROPERTY_PREFIX_LEN) == 0) {
>>>      const char* property_suffix = property + 
>>> MODULE_PROPERTY_PREFIX_LEN;
>>>      if (matches_property_suffix(property_suffix, ADDEXPORTS, 
>>> ADDEXPORTS_LEN) ||
>>>          matches_property_suffix(property_suffix, ADDREADS, 
>>> ADDREADS_LEN) ||
>>>          matches_property_suffix(property_suffix, ADDOPENS, 
>>> ADDOPENS_LEN) ||
>>>          matches_property_suffix(property_suffix, PATCH, PATCH_LEN) ||
>>>          matches_property_suffix(property_suffix, ADDMODS, 
>>> ADDMODS_LEN) ||
>>>          matches_property_suffix(property_suffix, LIMITMODS, 
>>> LIMITMODS_LEN) ||
>>>          matches_property_suffix(property_suffix, PATH, PATH_LEN) ||
>>>          matches_property_suffix(property_suffix, UPGRADE_PATH, 
>>> UPGRADE_PATH_LEN)) {
>>>        return true;
>>>      }
>>>    }
>>>    return false;
>>> }
>>>
>>> ... which is why this line no longer needs to say that a module 
>>> property is "UnwriteableProperty"
>>>
>>> -  bool added = add_property(property, UnwriteableProperty, internal);
>>> +  bool added = add_property(property, WriteableProperty, internal);
>>
>> The module property story is not clean either before or after this 
>> change. Strictly speaking the module properties should be Unwriteable 
>> because they cannot be set via -D on the command-line. But that is 
>> actually handled as a special-case by is_internal_module_property() 
>> as you noted. So the old code declared them Unwriteable, protected 
>> them from being set by -D via a different mechanism, and then used an 
>> inappropriate API to actually write to them anyway (breaking the code 
>> for other properties). The new code marks them Writeable, so it can 
>> use the proper API to update them, but relies on the 
>> is_internal_module_property() logic to ensure they are not set by -D.
>>
>> As this bug was concerned with not allowing other system properties 
>> to be changed when they should not be, I was not too concerned that 
>> the module property story remains unclean. A "proper" fix would be to 
>> accumulate the repeated module flags (e.g. --limit-mods=xxx) in a 
>> side structure (e.g. map) and then at the end of argument processing 
>> convert the map contents to actual Unwriteable properties. If anyone 
>> is so inclined they can file a RFE to do that.
>>
>>>
>>> I have some nits:
>>>
>>>
>>>   397   // Used for module system related properties: converted from 
>>> command-line flags
>>>   398   // Basic properties are writeable as they operate as "last 
>>> one wins" and will get overwritten.
>>>   399   // Numbered properties are never writeable, and always 
>>> internal.
>>>   400   static bool create_property(const char* prop_name, const 
>>> char* prop_value, PropertyInternal internal);
>>>   401   static bool create_numbered_property(const char* 
>>> prop_base_name, const char* prop_value, unsigned int count);
>>>
>>> I am not sure if anyone will read these comments and these functions 
>>> may be misused in the future. How about renaming them to
>>>
>>>      create_property_for_module
>>>      create_numbered_property_for_module
>>
>> Sure - though I would suggest
>>
>>    create_module_property
>>    create_numbered_module_property
>>
>>> BTW, is it possible to assert for is_internal_module_property() in 
>>> these two functions?
>>
>> I'll see if that is possible.
>
> It was possible with a special escape clause for 
> jdk.module.illegalAccess which for some reason is not included in the 
> set of internal module properties. That may be an oversight but it 
> isn't something I can change.
>
> Updated some commentary too.
>
> Updated webrev:
>
> http://cr.openjdk.java.net/~dholmes/8243936/webrev.v2/
>
> Thanks,
> David
>
>> Thanks,
>> David
>>
>>> Thanks
>>> - Ioi
>>>
>>>
>>> On 5/21/20 3:21 PM, David Holmes wrote:
>>>> webrev: http://cr.openjdk.java.net/~dholmes/8243936/webrev/
>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8243936
>>>>
>>>> Please see details in the bug report.
>>>>
>>>> tld;dr: we again call the set method that checks whether a flag is 
>>>> writeable, and I added the equivalent append version. Added some 
>>>> commentary about the methods used only for module options and 
>>>> changed the basic module properties to be writeable as they need to 
>>>> allow overriding.
>>>>
>>>> Testing:
>>>>   - added a new test that verifies you can't set a non-writeable 
>>>> property. (There's no test for the append case because we don't 
>>>> have any appendable non-writeable flags)
>>>>  - ran all the module related tests I could find to ensure no 
>>>> impact on the module flags
>>>>   - jdk/tools/launcher/modules/
>>>>   - jdk/com/sun/tools/attach/modules
>>>>   - jdk/java/lang/Class/forName/modules
>>>>   - jdk/java/lang/ClassLoader/getResource/modules
>>>>   - jdk/java/lang/SecurityManager/modules
>>>>   - jdk/java/lang/System/LoggerFinder/modules
>>>>   - jdk/java/lang/instrument/modules
>>>>   - jdk/java/lang/invoke/modules
>>>>   - jdk/java/sql/modules
>>>>   - jdk/java/util/ResourceBundle/modules
>>>>   - jdk/java/util/ServiceLoader/modules
>>>>   - jdk/java/util/logging/modules
>>>>   - jdk/javax/security/auth/login/modules
>>>>   - jdk/jdk/jfr/api/modules
>>>>   - jdk/jdk/modules
>>>>   - hotspot/jtreg/runtime/modules/
>>>>  - tiers 1-3
>>>>
>>>> Thanks,
>>>> David
>>>



More information about the hotspot-runtime-dev mailing list