newlocale(3) appears to be broken?

David Chisnall theraven at FreeBSD.org
Fri Apr 24 09:31:35 UTC 2015


On 23 Apr 2015, at 19:29, Steve Kargl <sgk at troutmask.apl.washington.edu> wrote:
> 
> It appears that newlocale(3) is broken.
> 
> First, the manpage indicates that one
> needs to use
> 
> #include <xlocale>

This is a typo in the man page, it should be xlocale.h

> 
> which leads to
> 
> troutmask:sgk[204] cc -o z r.c
> r.c:1:10: fatal error: 'xlocale' file not found
> #include <xlocale>
>         ^
> 1 error generated.
> 
> next the manpage says 
> 
> STANDARDS
>     This function conforms to IEEE Std 1003.1-2008 (``POSIX.1'').
> 
> However, http://pubs.opengroup.org/stage7tc1/functions/newlocale.html
> says newlocale is declared in locale.h.  

If you have the correct preprocessor definitions to indicate a POSIX2008 target, then they are visible in locale.h.  For earlier POSIX targets, they are exposed unconditionally in xlocale.h.  This is for Darwin (and, I think, GNU) compatibility.  I think that we should probably change the man pages to only refer to locale.h.

> 
> Now consider
> 
> % cat r.c
> 
> #include <locale.h>
> 
> int
> main(void)
> {
>   locale_t a;
>   a = newlocale(0, "C", 0);
>   if (a)
>      return 0;
>   else
>      return 1;
> }
> 
> troutmask:sgk[206] cc -o z -static r.c && ./z
> Segmentation fault (core dumped)
> 
> troutmask:sgk[206] cc -o z -static r.c && ./z
> Segmentation fault (core dumped)
> troutmask:sgk[207] gdb782 z z.core
> [New process 100313]
> Core was generated by `z'.
> Program terminated with signal SIGSEGV, Segmentation fault.
> #0  0x0000000000415798 in newlocale ()
> (gdb) bt
> #0  0x0000000000415798 in newlocale ()
> #1  0x0000000000400434 in main ()

I can reproduce this, though only with static linking.  Omitting the -static results in the program working correctly.  It appears to be caused by __xlocale_C_ctype being declared const, so the reference count manipulation causes segmentation faults.  I’m a bit surprised that this doesn’t happen in the dynamically linked version.  I’m testing a fix now.

David



More information about the freebsd-standards mailing list