summaryrefslogtreecommitdiff
path: root/locale
diff options
context:
space:
mode:
authorAurelien Jarno <aurelien@aurel32.net>2014-05-16 00:06:54 +0200
committerAurelien Jarno <aurelien@aurel32.net>2014-05-20 18:43:14 +0200
commitae75a883f2eb312165d1e1f423cea320f3c92ef5 (patch)
treef8090d0119513e8880d097e588e0b8ef7b393c93 /locale
parentde9d8f2098caeb19684710a3c0774f4fe38a5e2c (diff)
fix nl_langinfo with static linking (BZ #16915)
For static linking the locale code avoids linking code and data for unused categories. However for nl_langinfo we know only at runtime which categories are used, so direct reference to every nl_current_CATEGORY symbol should be done. This was broken by commit bc3e1c127392da88d0c8bf2ae728147982a3d1bc where nl_langinfo_l and nl_langinfo have been merged and some code has been lost in the process. In order to detect locales issues with static linking, compile a version of tst-langinfo with static linking. Note: this is Debian bug#747103 reported by Raphael <raphael.astier@eliot-sa.com>
Diffstat (limited to 'locale')
-rw-r--r--locale/nl_langinfo_l.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/locale/nl_langinfo_l.c b/locale/nl_langinfo_l.c
index b9d02aa8b8..2490af4f4e 100644
--- a/locale/nl_langinfo_l.c
+++ b/locale/nl_langinfo_l.c
@@ -20,6 +20,7 @@
#include <locale.h>
#include <errno.h>
#include <stddef.h>
+#include <stdlib.h>
#include "localeinfo.h"
@@ -43,7 +44,21 @@ __nl_langinfo_l (item, l)
if (index == _NL_ITEM_INDEX (_NL_LOCALE_NAME (category)))
return (char *) l->__names[category];
+#if defined NL_CURRENT_INDIRECT
+ /* Make direct reference to every _nl_current_CATEGORY symbol,
+ since we know only at runtime which categories are used. */
+ switch (category)
+ {
+# define DEFINE_CATEGORY(category, category_name, items, a) \
+ case category: data = *_nl_current_##category; break;
+# include "categories.def"
+# undef DEFINE_CATEGORY
+ default: /* Should be impossible. */
+ abort();
+ }
+#else
data = l->__locales[category];
+#endif
if (index >= data->nstrings)
/* Bogus index for this category: bogus item. */