diff options
author | Carlos O'Donell <carlos@systemhalted.org> | 2017-10-13 14:33:09 -0700 |
---|---|---|
committer | Carlos O'Donell <carlos@systemhalted.org> | 2017-10-13 22:30:19 -0700 |
commit | a3e23a2c1d9e871545c6f438a41fcb8ad429cf70 (patch) | |
tree | 4852c4d05471bf014dac09eeaaf30c568124f135 /locale | |
parent | f16491eb8ebbef402f3da6f4035ce70fe36dec97 (diff) | |
download | glibc-a3e23a2c1d9e871545c6f438a41fcb8ad429cf70.tar.gz glibc-a3e23a2c1d9e871545c6f438a41fcb8ad429cf70.tar.xz glibc-a3e23a2c1d9e871545c6f438a41fcb8ad429cf70.zip |
locale: Allow "" int_curr_Symbol (bug 22294)
The builtin POSIX locale has "" as the international currency symbol, but a non-builtin locale may not have such a blank int_curr_symbol. Therefore to support non-builtin locales with similar "" int_curr_symbol we adjust the LC_MONETARY parser to allow the normal 4-character int_curr_symbol *and* the empty "" no symbol. Anything else remains invalid. Tested by building all the locales. Tested also with a custom C.UTF-8 locale with "" for int_curr_symbol. Signed-off-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'locale')
-rw-r--r-- | locale/programs/ld-monetary.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c index 35d17490cb..9d94738041 100644 --- a/locale/programs/ld-monetary.c +++ b/locale/programs/ld-monetary.c @@ -216,14 +216,20 @@ No definition for %s category found"), "LC_MONETARY"); /* The international currency symbol must come from ISO 4217. */ if (monetary->int_curr_symbol != NULL) { - if (strlen (monetary->int_curr_symbol) != 4) + /* POSIX says this should be a 3-character symbol from ISO 4217 + along with a 4th character that is a divider, but the POSIX + locale is documented as having a special case of "", and we + support that also, so allow other locales to be created with + a blank int_curr_symbol. */ + int ics_len = strlen (monetary->int_curr_symbol); + if (ics_len != 4 && ics_len != 0) { if (! nothing) record_error (0, 0, _("\ %s: value of field `int_curr_symbol' has wrong length"), "LC_MONETARY"); } - else + else if (ics_len == 4) { /* Check the first three characters against ISO 4217 */ char symbol[4]; strncpy (symbol, monetary->int_curr_symbol, 3); |