]> sourceware.org Git - glibc.git/commitdiff
fix nl_langinfo with static linking (BZ #16915)
authorAurelien Jarno <aurelien@aurel32.net>
Thu, 15 May 2014 22:06:54 +0000 (00:06 +0200)
committerAurelien Jarno <aurelien@aurel32.net>
Tue, 20 May 2014 16:43:14 +0000 (18:43 +0200)
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>

ChangeLog
NEWS
locale/nl_langinfo_l.c
localedata/Makefile
localedata/tst-langinfo-static.c [new file with mode: 0644]
localedata/tst-langinfo.sh

index 2dae335e9c610f774349420588fbae11a92c94cc..59464a6478a650f074521f1275b6f9d6a0e476d7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2014-05-20  Aurelien Jarno  <aurelien@aurel32.net>
+
+       [BZ #16915]
+       * locale/nl_langinfo_l.c: Make direct reference to every
+       _nl_current_CATEGORY symbol.
+       * localedata/Makefile (test-srcs): Add tst-langinfo-static.
+       (tests-static): Add tst-langinfo-static.
+       (tests-special): Add tst-langinfo-static.out.
+       ($(objpfx)tst-langinfo.out): Redirect output.
+       ($(objpfx)tst-langinfo-static.out): New.
+       * localedata/tst-langinfo.sh: Send output to stdout.
+       * localedata/tst-langinfo-static.c: New file.
+
 2014-05-20  Richard Henderson  <rth@redhat.com>
 
        [BZ #16967]
diff --git a/NEWS b/NEWS
index 753ee18d2f7b1e7c96ac9f6eaf81d63d96d83ede..d9ce8f9af8acbe72cba9900c9740359f2a56d6cd 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -17,7 +17,8 @@ Version 2.20
   16712, 16713, 16714, 16731, 16739, 16740, 16743, 16754, 16758, 16759,
   16760, 16770, 16786, 16789, 16791, 16799, 16800, 16815, 16823, 16824,
   16831, 16838, 16849, 16854, 16876, 16877, 16885, 16888, 16890, 16912,
-  16916, 16917, 16922, 16927, 16928, 16932, 16943, 16958, 16966, 16967.
+  16915, 16916, 16917, 16922, 16927, 16928, 16932, 16943, 16958, 16966,
+  16967.
 
 * The minimum Linux kernel version that this version of the GNU C Library
   can be used with is 2.6.32.
index b9d02aa8b8b23f1f82f876f46c3c287480639d91..2490af4f4e76a55c33969359f036eef84d3b29ea 100644 (file)
@@ -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.  */
index 94562be0e2840dcd73f6e0dd47cf50192302bd63..48ec3de9c997444cb7911184db7e1f3d44c8ae98 100644 (file)
@@ -35,7 +35,7 @@ vpath %.h tests-mbwc
 
 test-srcs := collate-test xfrm-test tst-fmon tst-rpmatch tst-trans \
             tst-mbswcs1 tst-mbswcs2 tst-mbswcs3 tst-mbswcs4 tst-mbswcs5 \
-            tst-ctype tst-wctype tst-langinfo tst-numeric
+            tst-ctype tst-wctype tst-langinfo tst-langinfo-static tst-numeric
 test-input := de_DE.ISO-8859-1 en_US.ISO-8859-1 da_DK.ISO-8859-1 \
              hr_HR.ISO-8859-2 sv_SE.ISO-8859-1 tr_TR.UTF-8 fr_FR.UTF-8 \
              si_LK.UTF-8
@@ -95,7 +95,9 @@ tests-special += $(objpfx)sort-test.out $(objpfx)tst-fmon.out \
                 $(objpfx)tst-locale.out $(objpfx)tst-rpmatch.out \
                 $(objpfx)tst-trans.out $(objpfx)tst-mbswcs.out \
                 $(objpfx)tst-ctype.out $(objpfx)tst-wctype.out \
-                $(objpfx)tst-langinfo.out $(objpfx)tst-numeric.out
+                $(objpfx)tst-langinfo.out $(objpfx)tst-langinfo-static.out \
+                $(objpfx)tst-numeric.out
+tests-static += tst-langinfo-static
 
 ifeq ($(run-built-tests),yes)
 # We have to generate locales
@@ -197,7 +199,12 @@ $(objpfx)tst-wctype.out: tst-wctype.sh $(objpfx)tst-wctype \
 $(objpfx)tst-langinfo.out: tst-langinfo.sh $(objpfx)tst-langinfo \
                        $(objpfx)sort-test.out \
                        $(addprefix $(objpfx),$(CTYPE_FILES))
-       $(SHELL) $< $(common-objpfx) '$(test-program-cmd)'; \
+       $(SHELL) $< $(common-objpfx) '$(test-program-cmd)' > $@; \
+       $(evaluate-test)
+$(objpfx)tst-langinfo-static.out: tst-langinfo.sh $(objpfx)tst-langinfo-static \
+                       $(objpfx)sort-test.out \
+                       $(addprefix $(objpfx),$(CTYPE_FILES))
+       $(SHELL) $< $(common-objpfx) '$(test-program-cmd)' > $@; \
        $(evaluate-test)
 $(objpfx)tst-digits.out: $(objpfx)tst-locale.out
 $(objpfx)tst-mbswcs6.out: $(addprefix $(objpfx),$(CTYPE_FILES))
diff --git a/localedata/tst-langinfo-static.c b/localedata/tst-langinfo-static.c
new file mode 100644 (file)
index 0000000..46856a0
--- /dev/null
@@ -0,0 +1 @@
+#include "tst-langinfo.c"
index e75d22a61817a3324548fe8e02a72ab7fea177f0..bd489d024f13e00c124a4c83f8dc25fbcfa50597 100755 (executable)
@@ -340,7 +340,6 @@ ja_JP.EUC-JP         NOEXPR      ^([nN
 ja_JP.EUC-JP         CODESET     EUC-JP
 EOF
 LOCPATH=${common_objpfx}localedata GCONV_PATH=${common_objpfx}iconvdata \
-LC_ALL=tt_TT ${tst_langinfo} \
-    > ${common_objpfx}localedata/tst-langinfo.out
+LC_ALL=tt_TT ${tst_langinfo}
 
 exit $?
This page took 0.130059 seconds and 5 git commands to generate.