[PATCH] libstdc++: Ignore filesystem::canonical errors for /etc/localtime [PR125467]

Tomasz Kaminski tkaminsk@redhat.com
Thu Aug 13 09:38:14 GMT 2026


On Thu, Aug 13, 2026 at 8:46 AM Jonathan Wakely <jwakely.gcc@gmail.com>
wrote:

>
>
> On Thu, 13 Aug 2026, 07:10 Tomasz Kamiński, <tkaminsk@redhat.com> wrote:
>
>> While the errors from realpath (and readlink before
>> r17-2048-gcc195f7b11a406)
>> are ignored (str is left empty), the filesystem::canonical path thrown
>> exception in such situation. This patch ignores the error consistently,
>> by using error_code overload of filesystem::canonical.
>>
>> The !ec check before str assignment is not necessary, as standard requires
>> that filesystem::canonical returns empty path, but I think it helps
>> readability.
>>
>> libstdc++-v3/ChangeLog:
>>
>>         PR libstdc++/125467
>>         * src/c++20/tzdb.cc (tzdb::current_zone): Use error_code overload
>>         of filesystem::canonical to ignore errors.
>> ---
>> I agree there is inconsistency in treatment of filesystem errors, and
>> they seem to be consistently ignored on other paths. Torbjorn could you
>> confirm that this addresses the issue.
>> We will still need to wait for Jonathan to OK this.
>>
>> Not sure how to test this branch. But tested this change locally.
>> OK for trunk?
>>
>
> OK
>
I pushed it now.

>
> The newlib bug should still be fixed.
>
Yes, agreed.
My motivation was to properly support the cases where /etc/localtime is
missing,
and we fall back to "/etc/timezone",
 "/var/db/zoneinfo",  "/etc/sysconfig/clock" or
just "Etc/UTC". Currently, filesystem::canonical would just throw an
exception in this case.

>
>
>
>>  libstdc++-v3/src/c++20/tzdb.cc | 6 ++++--
>>  1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/libstdc++-v3/src/c++20/tzdb.cc
>> b/libstdc++-v3/src/c++20/tzdb.cc
>> index e358b778e2d..0d004a8a6fe 100644
>> --- a/libstdc++-v3/src/c++20/tzdb.cc
>> +++ b/libstdc++-v3/src/c++20/tzdb.cc
>> @@ -2335,8 +2335,10 @@ constinit tzdb_list::_Node::NumLeapSeconds
>> tzdb_list::_Node::num_leap_seconds;
>>         str = p;
>>        }
>>  #else
>> -    string sbuf = std::filesystem::canonical("/etc/localtime").string();
>> -    str = sbuf;
>> +    error_code ec;
>> +    string sbuf = std::filesystem::canonical("/etc/localtime",
>> ec).string();
>> +    if (!ec)
>> +      str = sbuf;
>>  #endif
>>
>>      if (!str.empty() && str != "/etc/localtime")
>> --
>> 2.55.0
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20260813/8e48a573/attachment.htm>


More information about the Libstdc++ mailing list