RFR: 8074895: os::getenv is inadequate

Jeremy Manson jeremymanson at google.com
Fri Mar 13 17:00:35 UTC 2015


Thanks, David!  New rev:

http://cr.openjdk.java.net/~jmanson/8074895/webrev.01/

On Thu, Mar 12, 2015 at 5:12 PM, David Holmes <david.holmes at oracle.com>
wrote:

> On 13/03/2015 6:31 AM, Jeremy Manson wrote:
>
>> On Wed, Mar 11, 2015 at 7:39 PM, David Holmes <david.holmes at oracle.com
>> <mailto:david.holmes at oracle.com>> wrote:
>>     On 11/03/2015 7:08 AM, Jeremy Manson wrote:
>>         I'd like you to do a code review, please.  Original discussion:
>>
>>         http://mail.openjdk.java.net/__pipermail/serviceability-dev/
>> __2015-March/016851.html
>>         <http://mail.openjdk.java.net/pipermail/serviceability-dev/
>> 2015-March/016851.html>
>>
>>         Per this discussion, I'm just getting rid of the os::getenv
>>         interface, and using straight getenv() everywhere.
>>
>>         Bug:
>>         https://bugs.openjdk.java.net/__browse/JDK-8074895
>>         <https://bugs.openjdk.java.net/browse/JDK-8074895>
>>
>>         Webrev:
>>         http://cr.openjdk.java.net/~__jmanson/8074895/webrev.00/
>>         <http://cr.openjdk.java.net/~jmanson/8074895/webrev.00/>
>>
>>
>>     In arguments.cpp the headless property setting could have been left
>>     using a local buffer rather than introducing NEW_C_HEAP_ARRAY. The
>>     value should only be true or false so there's no size issue
>>     regarding the local buffer.
>>
>>
>> Will do, but I won't bother with the rev until you tell me what to do
>> with:
>>
>>     3566   if ((buffer = os::strdup(buffer)) == NULL) {
>>     3567     return JNI_OK;
>>     3568   }
>>
>>     So this silently hides failures?
>>
>>
>> Yes.  Is there a best practice in Hotspot when you fail to allocate
>> memory?  I haven't noticed it, but I'm happy to, for example, die
>> horribly.
>>
>
> At this stage of the VM initialization we should be trying to be a good
> citizen and simply return JNI_ENOMEM, which will eventually make its way
> back to the caller of CreateJavaVM.
>
> Which also means your use of NEW_C_HEAP_ARRAY also needs changing as it
> will abort the VM. You want to use NEW_C_HEAP_ARRAY_RETURN_NULL and if NULL
> then return JNI_ENOMEM.
>

Done.


>
>      The only minor concern I have is whether
>>     os::print_environment___variables is now susceptible to any issues
>>     caused by arbitrarily long environment variables? But I suspect
>>     there is already a maximum permitted length for environment variables.
>>
>>
>> Which issues did you have in mind?  I guess if you were printing to a
>> string, the string would have to use extra memory.  But the getenv() was
>> being called anyway, so that's not much of an issue.
>>
>
> I was wondering if an absurdly long environment variable value could
> overflow some other internal buffer somewhere.


Not sure why that would be different from the old approach, which also
called getenv(), just underneath a layer of abstraction.  I'm *trying* to
do the right checking on everything above that, but I haven't run anything
like valgrind to make sure.


>      Also you could now do the same for os::unsetenv :)
>>
>> Sadly, that really *does* seem undefined on Windows, AFAICT.
>>
>
> Yeah they use _putenv with an empty value to remove the variable
>

Ah, well.

Jeremy


More information about the hotspot-runtime-dev mailing list