Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Apr 2015 10:31:14 +0100
From:      David Chisnall <theraven@FreeBSD.org>
To:        Steve Kargl <sgk@troutmask.apl.washington.edu>
Cc:        freebsd-standards@freebsd.org
Subject:   Re: newlocale(3) appears to be broken?
Message-ID:  <9239D309-A382-4691-B08E-739B545ED865@FreeBSD.org>
In-Reply-To: <20150423182733.GA14387@troutmask.apl.washington.edu>
References:  <20150423182733.GA14387@troutmask.apl.washington.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
On 23 Apr 2015, at 19:29, Steve Kargl <sgk@troutmask.apl.washington.edu> =
wrote:
>=20
> It appears that newlocale(3) is broken.
>=20
> First, the manpage indicates that one
> needs to use
>=20
> #include <xlocale>

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

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

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.

>=20
> Now consider
>=20
> % cat r.c
>=20
> #include <locale.h>
>=20
> int
> main(void)
> {
>   locale_t a;
>   a =3D newlocale(0, "C", 0);
>   if (a)
>      return 0;
>   else
>      return 1;
> }
>=20
> troutmask:sgk[206] cc -o z -static r.c && ./z
> Segmentation fault (core dumped)
>=20
> 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=E2=80=99m a bit surprised =
that this doesn=E2=80=99t happen in the dynamically linked version.  =
I=E2=80=99m testing a fix now.

David




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9239D309-A382-4691-B08E-739B545ED865>