Re: gai_strerror() is not thread-safe on Windows - Mailing list pgsql-hackers

From Thomas Munro
Subject Re: gai_strerror() is not thread-safe on Windows
Date
Msg-id CA+hUKGLAe-vdnwnUY+yKn3Ns+W-O9bcagH4pfkmZcQvwtLiCPg@mail.gmail.com
Whole thread Raw
In response to Re: gai_strerror() is not thread-safe on Windows  (Kyotaro Horiguchi <horikyota.ntt@gmail.com>)
Responses Re: gai_strerror() is not thread-safe on Windows
List pgsql-hackers
On Tue, Dec 5, 2023 at 3:43 PM Kyotaro Horiguchi
<horikyota.ntt@gmail.com> wrote:
> At Tue, 5 Dec 2023 08:26:54 +1300, Thomas Munro <thomas.munro@gmail.com> wrote in
> > On second thoughts, I guess it would make more sense to use the exact
> > messages Windows' own implementation would return instead of whatever
> > we had in the past (probably cribbed from some other OS or just made
> > up?).  I asked CI to spit those out[1].  Updated patch attached.  Will
> > add to CF.
> >
> > [1] https://cirrus-ci.com/task/5816802207334400?logs=main#L15
>
> Windows' gai_strerror outputs messages that correspond to the language
> environment. Similarly, I think that the messages that the messages
> returned by our version should be translatable.

Hmm, that is a good point.  Wow, POSIX has given us a terrible
interface here, in terms of resource management.  Let's see what glibc
does:

https://github.com/lattera/glibc/blob/master/sysdeps/posix/gai_strerror.c
https://github.com/lattera/glibc/blob/master/sysdeps/posix/gai_strerror-strs.h

It doesn't look like it knows about locales at all.  And a test
program seems to confirm:

#include <locale.h>
#include <netdb.h>
#include <stdio.h>
int main()
{
    setlocale(LC_MESSAGES, "ja_JP.UTF-8");
    printf("%s\n", gai_strerror(EAI_MEMORY));
}

That prints:

Memory allocation failure

FreeBSD tries harder, and prints:

メモリ割り当て失敗

We can see that it has a thread-local variable that holds a copy of
that localised string until the next call to gai_strerror() in the
same thread:

https://github.com/freebsd/freebsd-src/blob/main/lib/libc/net/gai_strerror.c
https://github.com/freebsd/freebsd-src/blob/main/lib/libc/nls/ja_JP.UTF-8.msg

FreeBSD's message catalogues would provide a read-made source of
translations, bu... hmm, if glibc doesn't bother and the POSIX
interface is unhelpful and Windows' own implementation is so willfully
unusable, I don't really feel inclined to build a whole thread-local
cache thing on our side just to support this mess.

So I think we should just hard-code the error messages in English and
move on.  However, English is my language so perhaps I should abstain
and leave it to others to decide how important that is.

> These messages may add extra line-end periods to the parent (or
> cotaining) messages when appended. This looks as follows.
>
> (auth.c:517 : errdetail_log() : sub (detail) message)
> > Could not translate client host name "hoge" to IP address: An address incompatible with the requested protocol was
used..
>
> (hba.c:1562 : errmsg() : main message)
> > invalid IP address "192.0.2.1": This is usually a temporary error during hostname resolution and means that the
localserver did not receive a response from an authoritative server. 
>
> When I first saw the first version, I thought it would be better to
> use Windows' own messages, just like you did. However, considering the
> content of the message above, wouldn't it be better to adhere to
> Linux-style messages overall?

Yeah, I agree that either the glibc or the FreeBSD messages would be
better than those now that I've seen them.  They are short and sweet.

> A slightly subtler point is that the second example seems to have a
> misalignment between the descriptions before and after the colon, but
> do you think it's not something to be concerned about to this extent?

I didn't understand what you meant here.



pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Emitting JSON to file using COPY TO
Next
From: Andrew Dunstan
Date:
Subject: Re: Remove MSVC scripts from the tree