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

Torbjorn SVENSSON torbjorn.svensson@foss.st.com
Thu Aug 13 12:14:03 GMT 2026


Hi Tomasz,

Thanks for looking into the regression that I reported.

On 2026-08-13 08:07, Tomasz Kamiński 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.

I've tried the patch on top of r17-2833-g32657f29f91871 and it pass'es.

I'm currently regtesting a patch for newlib that I will post later today
that should rectify the problem in newlib around _stat() for semihosting.

Kind regards,
Torbjörn

> 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?
> 
>   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")



More information about the Libstdc++ mailing list