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

David Holmes david.holmes at oracle.com
Fri May 22 05:12:44 UTC 2020


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