Hi,

It's good to see the addition of getlocalename_l from POSIX [1] in Cygwin 3.6.0.

[1] 
https://pubs.opengroup.org/onlinepubs/9799919799/functions/getlocalename_l.html

However, there are two bugs:


1) If the second argument is LC_GLOBAL_LOCALE, the return value is garbage.

How to reproduce:
========================== foo.c ============================
#include <locale.h>
#include <stdio.h>

int main ()
{
  const char *ret = getlocalename_l (LC_COLLATE, LC_GLOBAL_LOCALE);
  printf ("ret as a pointer = %p\n", ret);
  printf ("ret as a string = %s\n", ret);
  return 2;
}
===============================================================
$ x86_64-pc-cygwin-gcc -Wall -ggdb foo.c
$ ./a
ret as a pointer = 0x1f
$ echo $?
0

Bug 1: The return value is 0x1f, which is not a valid string.
Bug 2: The second printf, instead of crashing, terminates the
       program with exit code 0 (faking successful execution!).


2) If the first value is LC_ALL, the return value is NULL.
This can be seen from cygwin/newlib/libc/locale/getlocalename_l.c.

But POSIX [1] specific a valid return value in this case.

The comments in that source file are also wrong:

  - "If
     the value is LC_ALL or is not a supported locale category value (see
     <<setlocale>>), <<getlocalename_l>> shall fail."
    No, that's now how it is specified.
    <https://www.austingroupbugs.net/view.php?id=1220> specified it this
    way, but <https://www.austingroupbugs.net/view.php?id=1741> added the
    LC_ALL support.

  - "<<getlocalename_l>> is POSIX-1.2008 since Base Specification Issue 8"
    No, it was introduced in POSIX-1.2024.


Bruno




-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

Reply via email to