about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRafal Luzynski <digitalfreak@lingonborough.com>2017-07-12 01:32:33 +0200
committerRafal Luzynski <digitalfreak@lingonborough.com>2017-10-28 01:46:14 +0200
commitf301e5334065e93aace667fd4a87bce6fc1dbd13 (patch)
tree47234d1ead02ab03f501a6071d6190a7b5fe9c5b
parent7e9d70736b98950522549e63d5bb7f81ff9eb93b (diff)
downloadglibc-f301e5334065e93aace667fd4a87bce6fc1dbd13.tar.gz
glibc-f301e5334065e93aace667fd4a87bce6fc1dbd13.tar.xz
glibc-f301e5334065e93aace667fd4a87bce6fc1dbd13.zip
Correct the size of _nl_value_type_LC_... arrays.
There were several problems with checking the array size in the past,
for example BZ#356, caused by incorrectly assuming that every locale
token represents one element.  In fact, if a token represented
a subarray, for example an array of month names or characters category
and it appeared at the end of the array the compiler assumed that
the array ends just after the first element of the subarray.
A workaround used in the past was to skip some categories while testing,
for example LC_CTYPE.  Now when we are about to add alternative month
names to LC_TIME (BZ#10871) this will fail again.

	* locale/loadlocale.c: Correct size of
	_nl_value_type_LC_<category> arrays.

Reviewed-by: Zack Weinberg <zackw@panix.com>
-rw-r--r--ChangeLog5
-rw-r--r--locale/loadlocale.c6
2 files changed, 10 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 61bbfa64cc..a8c89b7383 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-10-27  Rafal Luzynski  <digitalfreak@lingonborough.com>
+
+	* locale/loadlocale.c: Correct size of
+	_nl_value_type_LC_<category> arrays.
+
 2017-10-27  Joseph Myers  <joseph@codesourcery.com>
 
 	* math/math.h [__HAVE_DISTINCT_FLOAT16 || (__HAVE_FLOAT16 && !_LIBC)]:
diff --git a/locale/loadlocale.c b/locale/loadlocale.c
index 2bdb39b4b8..2dba86d773 100644
--- a/locale/loadlocale.c
+++ b/locale/loadlocale.c
@@ -44,8 +44,12 @@ static const size_t _nl_category_num_items[] =
 
 #define NO_PAREN(arg, rest...) arg, ##rest
 
+/* The size of the array must be specified explicitly because some of
+   the 'items' may be subarrays, which will cause the compiler to deduce
+   an incorrect size from the initializer.  */
 #define DEFINE_CATEGORY(category, category_name, items, a) \
-static const enum value_type _nl_value_type_##category[] = { NO_PAREN items };
+static const enum value_type _nl_value_type_##category     \
+  [_NL_ITEM_INDEX (_NL_NUM_##category)] = { NO_PAREN items };
 #define DEFINE_ELEMENT(element, element_name, optstd, type, rest...) \
   [_NL_ITEM_INDEX (element)] = type,
 #include "categories.def"