diff options
author | Arjun Shankar <arjun@redhat.com> | 2020-07-07 20:31:48 +0200 |
---|---|---|
committer | Arjun Shankar <arjun@redhat.com> | 2020-07-07 20:34:07 +0200 |
commit | 91927b7c76437db860cd86a7714476b56bb39d07 (patch) | |
tree | febc3201dd995bb8324b4712a31fef6d1bea388a /intl | |
parent | 94d9c76e4acc798894ea23d9ac049ce7ce995ec0 (diff) | |
download | glibc-91927b7c76437db860cd86a7714476b56bb39d07.tar glibc-91927b7c76437db860cd86a7714476b56bb39d07.tar.gz glibc-91927b7c76437db860cd86a7714476b56bb39d07.tar.bz2 glibc-91927b7c76437db860cd86a7714476b56bb39d07.zip |
Rewrite iconv option parsing [BZ #19519]
This commit replaces string manipulation during `iconv_open' and iconv_prog
option parsing with a structured, flag based conversion specification. In
doing so, it alters the internal `__gconv_open' interface and accordingly
adjusts its uses.
This change fixes several hangs in the iconv program and therefore includes
a new test to exercise iconv_prog options that originally led to these hangs.
It also includes a new regression test for option handling in the iconv
function.
Reviewed-by: Florian Weimer <fweimer@redhat.com>
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'intl')
-rw-r--r-- | intl/dcigettext.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/intl/dcigettext.c b/intl/dcigettext.c index 465c8df34c..2e7c662bc7 100644 --- a/intl/dcigettext.c +++ b/intl/dcigettext.c @@ -1119,11 +1119,16 @@ _nl_find_msg (struct loaded_l10nfile *domain_file, outcharset = encoding; # ifdef _LIBC - /* We always want to use transliteration. */ - outcharset = norm_add_slashes (outcharset, "TRANSLIT"); - charset = norm_add_slashes (charset, ""); - int r = __gconv_open (outcharset, charset, &convd->conv, - GCONV_AVOID_NOCONV); + + struct gconv_spec conv_spec + = { .fromcode = norm_add_slashes (charset, ""), + .tocode = norm_add_slashes (outcharset, ""), + /* We always want to use transliteration. */ + .translit = true, + .ignore = false + }; + int r = __gconv_open (&conv_spec, &convd->conv, + GCONV_AVOID_NOCONV); if (__builtin_expect (r != __GCONV_OK, 0)) { /* If the output encoding is the same there is |