about summary refs log tree commit diff
path: root/locale/programs
diff options
context:
space:
mode:
authorCarlos O'Donell <carlos@systemhalted.org>2017-10-13 14:33:09 -0700
committerCarlos O'Donell <carlos@systemhalted.org>2017-10-13 22:30:19 -0700
commita3e23a2c1d9e871545c6f438a41fcb8ad429cf70 (patch)
tree4852c4d05471bf014dac09eeaaf30c568124f135 /locale/programs
parentf16491eb8ebbef402f3da6f4035ce70fe36dec97 (diff)
downloadglibc-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/programs')
-rw-r--r--locale/programs/ld-monetary.c10
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);