From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/9820 Path: news.gmane.org!not-for-mail From: Assaf Gordon Newsgroups: gmane.linux.lib.musl.general Subject: Possible bug in setlocale upon invalid LC_ALL value Date: Fri, 1 Apr 2016 20:47:01 -0400 Message-ID: <4C4AEBC7-4344-4867-B8F6-F1A691F123E0@gmail.com> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2102\)) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable X-Trace: ger.gmane.org 1459558061 13066 80.91.229.3 (2 Apr 2016 00:47:41 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 2 Apr 2016 00:47:41 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-9833-gllmg-musl=m.gmane.org@lists.openwall.com Sat Apr 02 02:47:40 2016 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1am9j0-0007dc-NS for gllmg-musl@m.gmane.org; Sat, 02 Apr 2016 02:47:38 +0200 Original-Received: (qmail 13594 invoked by uid 550); 2 Apr 2016 00:47:35 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 13356 invoked from network); 2 Apr 2016 00:47:15 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:content-transfer-encoding:subject:message-id:date:to :mime-version; bh=+96VGlVtEmwDOT3xiI0/P/qSeK7QfBbnMgsime5qEJc=; b=zIaq2cKyXDKFwc4EVAo9LFi7mJSUp/XEaUOK7YACjP9uJfi4UZ7csO5eez2z5lcklW QckBECG4hcGLU2dWO6oAkJuSK3BzCohUIrHjzN36WEqwJJyZAfswynICKhraiAyQlaLP uNM0ipqYUbrhwfoJycuIvLahQ67BKt8n9oFeMtGdb4EiRoeoCjgohqQ/bHy1Sh4hwcGl ewf3SbQcja7uWkHnQoc2efTdFulaZL1RFDXQbvMOB+v9IGHPxZA8ylmLz7Y49551e2a0 eCsyQYd/dOP3Kp/BPQ0cpn/KCsZMSWzeA/HLRJ0OBKStppvL+AtdVo2l20JlXZpBjLQ+ AAHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:content-transfer-encoding:subject :message-id:date:to:mime-version; bh=+96VGlVtEmwDOT3xiI0/P/qSeK7QfBbnMgsime5qEJc=; b=j1iZodDtYlPbx7KTR+C79ADf/qDimfjkp2bo229t+2lgCLJ9GxvakVy43Lfpcp2EyO u5l3EDCns8NasRuEOLF3x7ZLnywzB+cXWf9MAm1HUkjuleqQuPBKP7u8Vf+fbSJWgTZq qRGDytU74QSIA7+YeIhsVKTE6gCD0XzbOdPewNMHwQ9iDh706OHEiQZhjWZbo0i36fo+ czOkQ5PqFCKJhiW/RS7GrVugiAzJkFAzuXcVtqnle36l2RHITViYR/OjZZugTm3eXVbR VmnUXYfI+eCuMls7GJhnZi1TWB74uqT3UPURfFEa0++Y/bn2HKy/B+DeEDUdUq8DrrOZ aijA== X-Gm-Message-State: AD7BkJKCcSgVX4p1VnI3eF733reX3u5ybyXUYp9pEStDKEUP8H1ZQ6uSQLZ4TVd3gXMLzQ== X-Received: by 10.140.19.211 with SMTP id 77mr22411519qgh.43.1459558023672; Fri, 01 Apr 2016 17:47:03 -0700 (PDT) X-Mailer: Apple Mail (2.2102) Xref: news.gmane.org gmane.linux.lib.musl.general:9820 Archived-At: Hello musl developers, I'm testing compilation of GNU coreutils on Alpine Linux 3.3.3 (linux = kernel 4.1.20, musl-1.1.12-r3). I think I've encountered a problem in musl, where using setlocale with = invalid locale name returns the invalid locale instead of a known = locale. example: $ LC_ALL=3Dmissing ./myprogram If myprogram calls setlocale(LC_ALL,""), then musl sets the internal locale despite being invalid value. later, checking the locale for a specific category (e.g. LC_COLLATE) = will return 'missing' instead of 'C' . The relevant POSIX clause is this: = http://pubs.opengroup.org/onlinepubs/9699919799/functions/setlocale.html "[...] If the value of any of these environment variable searches = yields a locale that is not supported (and non-null), setlocale() shall return a null = pointer and the global locale shall not be changed." Below is a short C program demonstrating the issue, with example output = from various OSes. comments welcomed, - assaf /* Test 'setlocale()' behaviour. compile: cc -o print-locale print-locale.c test: ./print-locale LC_ALL=3DC ./print-locale LC_ALL=3Dmissing ./print-locale */ #include #include #include int main(void) { char* p =3D getenv("LC_ALL"); printf("LC_ALL env var =3D '%s'\n", p?p:"(NULL)"); p =3D setlocale(LC_ALL,""); printf("setlocale(LC_ALL,\"\") =3D '%s'\n", p?p:"(NULL)"); p =3D setlocale(LC_ALL,NULL); printf("LC_ALL from setlocale =3D '%s'\n", p?p:"(NULL)"); p =3D setlocale(LC_COLLATE,NULL); printf("LC_COLLATE from setlocale =3D '%s'\n", p?p:"(NULL)"); return 0; } =3D=3D=3D=3D musl libc =3D=3D=3D=3D=3D=3D=3D $ ./print-locale LC_ALL env var =3D '(NULL)' setlocale(LC_ALL,"") =3D 'C.UTF-8;C;C;C;C;C' LC_ALL from setlocale =3D 'C.UTF-8;C;C;C;C;C' LC_COLLATE from setlocale =3D 'C' $ LC_ALL=3Dc ./print-locale LC_ALL env var =3D 'C' setlocale(LC_ALL,"") =3D 'C;C;C;C;C;C' LC_ALL from setlocale =3D 'C;C;C;C;C;C' LC_COLLATE from setlocale =3D 'C' $ LC_ALL=3Dmissing ./print-locale LC_ALL env var =3D 'missing' setlocale(LC_ALL,"") =3D = 'missing;missing;missing;missing;missing;missing' LC_ALL from setlocale =3D = 'missing;missing;missing;missing;missing;missing' LC_COLLATE from setlocale =3D 'missing' =3D=3D=3D=3D glibc (Ubuntu) =3D=3D=3D=3D $ ./print-locale LC_ALL env var =3D '(NULL)' setlocale(LC_ALL,"") =3D 'en_US.UTF-8' LC_ALL from setlocale =3D 'en_US.UTF-8' LC_COLLATE from setlocale =3D 'en_US.UTF-8' $ LC_ALL=3DC ./print-locale LC_ALL env var =3D 'C' setlocale(LC_ALL,"") =3D 'C' LC_ALL from setlocale =3D 'C' LC_COLLATE from setlocale =3D 'C' $ LC_ALL=3Dmissing ./print-locale LC_ALL env var =3D 'missing' setlocale(LC_ALL,"") =3D '(NULL)' LC_ALL from setlocale =3D 'C' LC_COLLATE from setlocale =3D 'C' =3D=3D=3D=3D FreeBSD 10.1 =3D=3D=3D=3D $ ./print-locale LC_ALL env var =3D '(NULL)' setlocale(LC_ALL,"") =3D 'C' LC_ALL from setlocale =3D 'C' LC_COLLATE from setlocale =3D 'C' $ LC_ALL=3DC ./print-locale LC_ALL env var =3D 'C' setlocale(LC_ALL,"") =3D 'C' LC_ALL from setlocale =3D 'C' LC_COLLATE from setlocale =3D 'C' $ LC_ALL=3Dmissing ./print-locale LC_ALL env var =3D 'missing' setlocale(LC_ALL,"") =3D '(NULL)' LC_ALL from setlocale =3D 'C' LC_COLLATE from setlocale =3D 'C' =3D=3D=3D=3D OpenBSD 5.8 =3D=3D=3D=3D $ ./print-locale LC_ALL env var =3D '(NULL)' setlocale(LC_ALL,"") =3D 'C' LC_ALL from setlocale =3D 'C' LC_COLLATE from setlocale =3D 'C' $ LC_ALL=3DC ./print-locale LC_ALL env var =3D 'C' setlocale(LC_ALL,"") =3D 'C' LC_ALL from setlocale =3D 'C' LC_COLLATE from setlocale =3D 'C' $ LC_ALL=3Dmissing ./print-locale LC_ALL env var =3D 'missing' setlocale(LC_ALL,"") =3D 'C/missing/C/C/C/C' LC_ALL from setlocale =3D 'C/missing/C/C/C/C' LC_COLLATE from setlocale =3D 'C' =3D=3D=3D=3D AIX 7 =3D=3D=3D $ ./print-locale LC_ALL env var =3D '(NULL)' setlocale(LC_ALL,"") =3D 'en_US en_US en_US en_US en_US en_US' LC_ALL from setlocale =3D 'en_US en_US en_US en_US en_US en_US' LC_COLLATE from setlocale =3D 'en_US' $ LC_ALL=3DC ./print-locale LC_ALL env var =3D 'C' setlocale(LC_ALL,"") =3D 'C C C C C C' LC_ALL from setlocale =3D 'C C C C C C' LC_COLLATE from setlocale =3D 'C' $ LC_ALL=3Dmissing ./print-locale LC_ALL env var =3D 'missing' setlocale(LC_ALL,"") =3D '(NULL)' LC_ALL from setlocale =3D 'C C C C C C' LC_COLLATE from setlocale =3D 'C'