From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI, RCVD_IN_MSPIKE_H2 autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 31302 invoked from network); 20 Mar 2023 12:18:57 -0000 Received: from second.openwall.net (193.110.157.125) by inbox.vuxu.org with ESMTPUTF8; 20 Mar 2023 12:18:57 -0000 Received: (qmail 28270 invoked by uid 550); 20 Mar 2023 12:18:55 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 28235 invoked from network); 20 Mar 2023 12:18:54 -0000 Date: Mon, 20 Mar 2023 08:18:42 -0400 From: Rich Felker To: Bruno Haible Cc: musl@lists.openwall.com Message-ID: <20230320121841.GR4163@brightrain.aerifal.cx> References: <11995006.zapYfy813O@nimes> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <11995006.zapYfy813O@nimes> User-Agent: Mutt/1.5.21 (2010-09-15) Subject: Re: [musl] swprintf: minimum width ignored for %lc On Mon, Mar 20, 2023 at 01:29:47AM +0100, Bruno Haible wrote: > On musl-1.2.3 I see this violation of the POSIX specification of swprintf [1]: > > ==================================== foo1.c ==================================== > #include > #include > > int main () > { > static wint_t L_x = (wchar_t) 'x'; > wchar_t buf[12] = > { 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, > 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF }; > int ret = swprintf (buf, 12, L"%10lc", L_x); > printf ("ret = %d, buf[0] = 0x%x, buf[1] = 0x%x, buf[9] = 0x%x, buf[10] = 0x%x, buf[11] = 0x%x\n", > ret, > (unsigned int) buf[0], (unsigned int) buf[1], > (unsigned int) buf[9], (unsigned int) buf[10], (unsigned int) buf[11]); > return 0; > } > /* > glibc: ret = 10, buf[0] = 0x20, buf[1] = 0x20, buf[9] = 0x78, buf[10] = 0x0, buf[11] = 0xdeadbeef > musl libc: ret = 1, buf[0] = 0x78, buf[1] = 0x0, buf[9] = 0xdeadbeef, buf[10] = 0xdeadbeef, buf[11] = 0xdeadbeef > */ > ================================================================================ > > $ gcc -Wall foo1.c > $ ./a.out > ret = 1, buf[0] = 0x78, buf[1] = 0x0, buf[9] = 0xdeadbeef, buf[10] = 0xdeadbeef, buf[11] = 0xdeadbeef > > The POSIX specification [1] says: > "An optional minimum field width. If the converted value has fewer wide > characters than the field width, it shall be padded with characters > by default on the left; it shall be padded on the right, if the left- > adjustment flag ( '-' ), described below, is given to the field width. The > field width takes the form of an ( '*' ), described below, or a > decimal integer." > > Here, the minimum field width specification of 10 was apparently ignored. Indeed, it's very clear from the code that it was just ignored. This has a simple direct fix. Rich