Update.
authorUlrich Drepper <drepper@redhat.com>
Sun, 26 Sep 2004 03:40:38 +0000 (03:40 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 26 Sep 2004 03:40:38 +0000 (03:40 +0000)
* intl/finddomain.c (_nl_find_domain): Protect calls to
_nl_make_l10nflist.

ChangeLog
intl/finddomain.c

index e0a5f2c..abb6328 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2004-09-25  Ulrich Drepper  <drepper@redhat.com>
 
+       * intl/finddomain.c (_nl_find_domain): Protect calls to
+       _nl_make_l10nflist.
+
        * sysdeps/posix/getaddrinfo.c (getaddrinfo): If determinination of
        source address fails, initialized source_addr_len field so that
        duplicate address recognition does not copy junk.
index 6988d9e..9af765d 100644 (file)
@@ -35,6 +35,7 @@
 #include "gettextP.h"
 #ifdef _LIBC
 # include <libintl.h>
+# include <bits/libc-lock.h>
 #else
 # include "libgnuintl.h"
 #endif
@@ -78,11 +79,17 @@ _nl_find_domain (dirname, locale, domainname, domainbinding)
                (4) modifier
    */
 
+  /* We need to protect modifying the _NL_LOADED_DOMAINS data.  */
+  __libc_lock_define_initialized (static, lock);
+  __libc_lock_lock (lock);
+
   /* If we have already tested for this locale entry there has to
      be one data set in the list of loaded domains.  */
   retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
                               strlen (dirname) + 1, 0, locale, NULL, NULL,
                               NULL, NULL, domainname, 0);
+  __libc_lock_unlock (lock);
+
   if (retval != NULL)
     {
       /* We know something about this locale.  */
@@ -102,6 +109,7 @@ _nl_find_domain (dirname, locale, domainname, domainbinding)
          if (retval->successor[cnt]->data != NULL)
            break;
        }
+
       return cnt >= 0 ? retval : NULL;
       /* NOTREACHED */
     }
@@ -132,12 +140,17 @@ _nl_find_domain (dirname, locale, domainname, domainbinding)
   mask = _nl_explode_name (locale, &language, &modifier, &territory,
                           &codeset, &normalized_codeset);
 
+  /* We need to protect modifying the _NL_LOADED_DOMAINS data.  */
+  __libc_lock_lock (lock);
+
   /* Create all possible locale entries which might be interested in
      generalization.  */
   retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
                               strlen (dirname) + 1, mask, language, territory,
                               codeset, normalized_codeset, modifier,
                               domainname, 1);
+  __libc_lock_unlock (lock);
+
   if (retval == NULL)
     /* This means we are out of core.  */
     return NULL;