RFR: 8299665: /proc/self/stat parsing in libmanagement broken by execname with spaces

Kevin Walls kevinw at openjdk.org
Fri May 26 10:51:57 UTC 2023


On Wed, 24 May 2023 23:48:52 GMT, Serguei Spitsyn <sspitsyn at openjdk.org> wrote:

>> Code that parses /proc/self/stat may be broken if the executable name contains spaces.
>> 
>> We have code that does this correctly, and code that does not.
>> UnixOperatingSystem.c is Linux-specific OS code, and has vread_statdata which correctly uses strrchr to find the last ) and parses from there.
>> 
>> OperatingSystemImpl.c the generic, not Linux-specific code, is not OK, as Java_com_sun_management_internal_OperatingSystemImpl_getCommittedVirtualMemorySize0 has a problematic fscanf call. 
>> But the problematic fscanf call is Linux-specific: we use ifdef to create OS-specific implementations.
>> 
>> 
>> Need to change the fscanf of /proc/self/stat to do the same buffered read as read_ticks in UnixOperatingSystem.c (the Linux-specific code), with strrchr to read past the ) of the execname.
>> 
>> Moving the actually-Linux-specific getCommittedVirtualMemorySize0 to be with the other Linux-specific code means it can just use the existing method for accessing /proc/self/stat.
>> 
>> It does however call throw_internal_error, which is then not accessible.  So that function can be shared in the libmanagement_ext.h/.c for both uses.
>> 
>> The call to throw_internal_error is working: if I change the code to fail, it reports a java.lang.InternalError as it would before.
>> 
>> Existing tests still pass: 
>> i.e. test/jdk/com/sun/management/OperatingSystemMXBean/GetCommittedVirtualMemorySize.java
>
> Thank you for explanation! Looks good.

Thanks @sspitsyn and @alexmenkov for the reviews!

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

PR Comment: https://git.openjdk.org/jdk/pull/14107#issuecomment-1564203867


More information about the serviceability-dev mailing list