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