Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <2976941.0vhOF50zNu@nimes>
Date: Mon, 12 Jun 2023 16:44:44 +0200
From: Bruno Haible <bruno@...sp.org>
To: musl@...ts.openwall.com
Subject: swprintf %lc directive does not work for some wide characters

According to ISO C 11 § 7.29.2.1, in the *wprintf family of functions, the
%lc directive works like this:
  "[If an l length modifier is present,] the wint_t argument is converted to
   wchar_t and written."

Likewise in ISO C 17 § 7.29.2 and ISO C 23 § 7.31.2.1 and in POSIX:2018
<https://pubs.opengroup.org/onlinepubs/9699919799/functions/fwprintf.html>.

In musl libc 1.2.4 (as part of Alpine Linux 3.18.0) this does not work for
some characters.

How to reproduce:
=================================== foo.c ===================================
#include <stdio.h>
#include <wchar.h>
int main ()
{
  static wint_t L_invalid = (wchar_t) 0x76543210;
  wchar_t buf[3];
  int ret = swprintf (buf, 3, L"%lc", L_invalid);
  if (ret >= 0)
    fprintf (stderr, "OK, %d characters\n", ret);
  else
    perror ("swprintf failed");
}
=============================================================================
$ gcc -Wall foo.c
$ ./a.out

Expected output:
OK, 1 characters

Actual output:
swprintf failed: Illegal byte sequence



Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.