This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Reject invalid category values for dcgettext


Hi!

E.g. dcgettext("foo", "bar", -32) would segfault...

2002-08-30  Jakub Jelinek  <jakub@redhat.com>

	* intl/dcigettext.c: Include localeinfo.h.
	(dcigettext): Check for invalid category values.
	(category_to_name): Use _nl_category_names.

--- libc/intl/dcigettext.c.jj	2002-08-05 08:44:15.000000000 +0200
+++ libc/intl/dcigettext.c	2002-08-30 19:57:24.000000000 +0200
@@ -69,6 +69,10 @@ extern int errno;
 # include <sys/param.h>
 #endif
 
+#ifdef _LIBC
+# include <locale/localeinfo.h>
+#endif
+
 #include "gettextP.h"
 #include "plural-exp.h"
 #ifdef _LIBC
@@ -391,6 +395,16 @@ DCIGETTEXT (domainname, msgid1, msgid2, 
   if (msgid1 == NULL)
     return NULL;
 
+  if (category == LC_ALL
+#ifdef _LIBC
+      || category >= (unsigned) __LC_LAST
+#endif
+      )
+    return (plural == 0
+	    ? (char *) msgid1
+	      /* Use the Germanic plural rule.  */
+	    : n == 1 ? (char *) msgid1 : (char *) msgid2);
+
   __libc_rwlock_rdlock (_nl_state_lock);
 
   /* If DOMAINNAME is NULL, we are interested in the default domain.  If
@@ -992,6 +1006,9 @@ internal_function
 category_to_name (category)
      int category;
 {
+#ifdef _LIBC
+  return _nl_category_names[category];
+#else
   const char *retval;
 
   switch (category)
@@ -1044,6 +1061,7 @@ category_to_name (category)
   }
 
   return retval;
+#endif
 }
 
 /* Guess value of current locale from value of the environment variables.  */

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]