RFR: 8338851: Hoist os::Posix::realpath() to os::realpath() and implement on Windows [v11]

Simon Tooke stooke at openjdk.org
Thu Sep 19 07:26:42 UTC 2024


On Thu, 19 Sep 2024 04:24:09 GMT, David Holmes <dholmes at openjdk.org> wrote:

>> Simon Tooke has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   remove tabs
>
> test/hotspot/gtest/runtime/test_os.cpp line 433:
> 
>> 431:   errno = 0;
>> 432:   returnedBuffer = os::realpath(tmppath, buffer, MAX_PATH);
>> 433:   EXPECT_TRUE(returnedBuffer == buffer);
> 
> Should we also do `EXPECT_TRUE(errno == 0);` ? Here and below.

This is interesting!  I found that on Linux, errno _was not zero_!  The specifications for POSIX realpath say
`RETURN VALUE
Upon successful completion, realpath() shall return a pointer to the resolved name. Otherwise, realpath() shall return a null pointer and set errno to indicate the error, and the contents of the buffer pointed to by resolved_name are undefined.`
Nowhere does it say errno is unchanged if successful.


  errno = 0;
  ::printf("before ::realpath("/tmp",nullptr) errno=%d\n", errno);
  char* p = ::realpath("/tmp", nullptr);
  ::printf("after ::realpath p=%s errno=%d\n", p, errno);


outputs:

before ::realpath("/tmp",nullptr) errno=0
after ::realpath /tmp p=/tmp errno=22

With behaviour like this, one can see why OpenJDK wraps ::realpath()...

Compiler used: g++ (GCC) 14.2.1 20240801

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

PR Review Comment: https://git.openjdk.org/jdk/pull/20683#discussion_r1766296852


More information about the serviceability-dev mailing list