Bug#1018881: glibc: iconv not working properly on m68k and sh4
John Paul Adrian Glaubitz <[email protected]> Thu, 01 Sep 2022 12:41:18 +0200
| Newsgroups | gmane.linux.debian.ports.superh |
|---|---|
| Message-ID | <166202887869.979514.7710870386394958091.reportbug__2536.14886184863$1662029139$gmane$org@nofan.physik.fu-berlin.de> |
Source: glibc Version: 2.34-7 Severity: normal User: [email protected] Usertags: m68k sh4 X-Debbugs-Cc: [email protected],[email protected] Hello! iconv stopped working on m68k and sh4 starting with glibc 2.34 and I have no clue why. The issue can be reproduced on real hardware qemu-user and qemu-system. The problem becomes visible when the configure script of the gettext package is being run on the affected architectures: checking for iconv... yes checking for working iconv... no checking for iconv declaration... extern size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); checking for inttypes.h... (cached) yes checking for limits.h... (cached) yes The configure script runs a small program which I have extracted and attached to this bug report as iconv.c. Running it on amd64 returns a zero exit code: (sid-amd64-sbuild)root@nofan:/# gcc -o iconv iconv.c -lc (sid-amd64-sbuild)root@nofan:/# ./iconv (sid-amd64-sbuild)root@nofan:/# echo $? 0 (sid-amd64-sbuild)root@nofan:/# On m68k and sh4, the exit code is 16 which is why the above configure check fails: glaubitz@tirpitz:~$ uname -a Linux tirpitz 5.11.0-rc4-00012-g10c03c5bf422 #161 PREEMPT Mon Jan 18 21:10:17 CET 2021 sh4a GNU/Linux glaubitz@tirpitz:~$ gcc -o iconv iconv.c -lc glaubitz@tirpitz:~$ ./iconv glaubitz@tirpitz:~$ echo $? 16 glaubitz@tirpitz:~$ I have run out of ideas why iconv fails, so I was wondering whether this might be a packaging issue. I have found a similar iconv issue being discussed on a Fedora mailing list where the cause was iconv data being moved out of the main glibc packages [1]. Maybe we have a similar problem in Debian which manifests on m68k and sh4 only due to some reverse dependencies being out of date? Thanks, Adrian > [1] https://lists.fedoraproject.org/archives/list/[email protected]/message/IWAOAD6XXXAPBQZ364OKVBZZXDDHG2KS/ -- .''`. John Paul Adrian Glaubitz : :' : Debian Developer `. `' Physicist `- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913
iconv.c
(text/plain, 3.7 KB)
#include <iconv.h>
#include <string.h>
#define ICONV_CONST
int main() {
int result = 0;
/* Test against AIX 5.1 bug: Failures are not distinguishable from successful
returns. */
{
iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
if (cd_utf8_to_88591 != (iconv_t)(-1))
{
static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
char buf[10];
ICONV_CONST char *inptr = input;
size_t inbytesleft = strlen (input);
char *outptr = buf;
size_t outbytesleft = sizeof (buf);
size_t res = iconv (cd_utf8_to_88591,
&inptr, &inbytesleft,
&outptr, &outbytesleft);
if (res == 0)
result |= 1;
iconv_close (cd_utf8_to_88591);
}
}
/* Test against Solaris 10 bug: Failures are not distinguishable from
successful returns. */
{
iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
if (cd_ascii_to_88591 != (iconv_t)(-1))
{
static ICONV_CONST char input[] = "\263";
char buf[10];
ICONV_CONST char *inptr = input;
size_t inbytesleft = strlen (input);
char *outptr = buf;
size_t outbytesleft = sizeof (buf);
size_t res = iconv (cd_ascii_to_88591,
&inptr, &inbytesleft,
&outptr, &outbytesleft);
if (res == 0)
result |= 2;
iconv_close (cd_ascii_to_88591);
}
}
/* Test against AIX 6.1..7.1 bug: Buffer overrun. */
{
iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
if (cd_88591_to_utf8 != (iconv_t)(-1))
{
static ICONV_CONST char input[] = "\304";
static char buf[2] = { (char)0xDE, (char)0xAD };
ICONV_CONST char *inptr = input;
size_t inbytesleft = 1;
char *outptr = buf;
size_t outbytesleft = 1;
size_t res = iconv (cd_88591_to_utf8,
&inptr, &inbytesleft,
&outptr, &outbytesleft);
if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
result |= 4;
iconv_close (cd_88591_to_utf8);
}
}
#if 0 /* This bug could be worked around by the caller. */
/* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
{
iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
if (cd_88591_to_utf8 != (iconv_t)(-1))
{
static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
char buf[50];
ICONV_CONST char *inptr = input;
size_t inbytesleft = strlen (input);
char *outptr = buf;
size_t outbytesleft = sizeof (buf);
size_t res = iconv (cd_88591_to_utf8,
&inptr, &inbytesleft,
&outptr, &outbytesleft);
if ((int)res > 0)
result |= 8;
iconv_close (cd_88591_to_utf8);
}
}
#endif
/* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
provided. */
{
/* Try standardized names. */
iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP");
/* Try IRIX, OSF/1 names. */
iconv_t cd2 = iconv_open ("UTF-8", "eucJP");
/* Try AIX names. */
iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP");
/* Try HP-UX names. */
iconv_t cd4 = iconv_open ("utf8", "eucJP");
if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1)
&& cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1))
result |= 16;
if (cd1 != (iconv_t)(-1))
iconv_close (cd1);
if (cd2 != (iconv_t)(-1))
iconv_close (cd2);
if (cd3 != (iconv_t)(-1))
iconv_close (cd3);
if (cd4 != (iconv_t)(-1))
iconv_close (cd4);
}
return result;
}