diff options
Diffstat (limited to 'catgets')
-rw-r--r-- | catgets/catgets.c | 95 | ||||
-rw-r--r-- | catgets/open_catalog.c | 27 |
2 files changed, 50 insertions, 72 deletions
diff --git a/catgets/catgets.c b/catgets/catgets.c index 55de30e..c6fd13d 100644 --- a/catgets/catgets.c +++ b/catgets/catgets.c @@ -33,23 +33,12 @@ nl_catd catopen (const char *cat_name, int flag) { __nl_catd result; - const char *env_var; - const char *nlspath; - - result = (__nl_catd) malloc (sizeof (*result)); - if (result == NULL) - /* We cannot get enough memory. */ - return (nl_catd) -1; - - result->status = closed; - - result->cat_name = __strdup (cat_name); - if (result->cat_name == NULL) - { - free (result); - __set_errno (ENOMEM); - return (nl_catd) -1; - } + const char *env_var = NULL; + const char *nlspath = NULL; + size_t cat_name_len = strlen (cat_name) + 1; + size_t env_var_len = 0; + size_t nlspath_len = 0; + char *endp; if (strchr (cat_name, '/') == NULL) { @@ -57,32 +46,19 @@ catopen (const char *cat_name, int flag) { env_var = getenv ("LC_ALL"); if (env_var == NULL) - { - env_var = getenv ("LC_MESSAGES"); - if (env_var == NULL) - { - env_var = getenv ("LANG"); - if (env_var == NULL) - env_var = "C"; - } - } - } - else - { - env_var = getenv ("LANG"); - if (env_var == NULL) - env_var = "C"; - } + env_var = getenv ("LC_MESSAGES"); - result->env_var = __strdup (env_var); - if (result->env_var == NULL) - { - free ((void *) result->cat_name); - free ((void *) result); - __set_errno (ENOMEM); - return (nl_catd) -1; + if (env_var != NULL) + goto have_env_var; } + env_var = getenv ("LANG"); + if (env_var == NULL) + env_var = "C"; + + have_env_var: + env_var_len = strlen (env_var) + 1; + nlspath = __secure_getenv ("NLSPATH"); if (nlspath != NULL && *nlspath != '\0') { @@ -92,25 +68,32 @@ catopen (const char *cat_name, int flag) __stpcpy (__stpcpy (__stpcpy (tmp, nlspath), ":"), NLSPATH); nlspath = tmp; + + nlspath_len = len; } else - nlspath = NLSPATH; - - result->nlspath = __strdup (nlspath); - if (result->nlspath == NULL) { - free ((void *) result->cat_name); - free ((void *) result->env_var); - free ((void *) result); - __set_errno (ENOMEM); - return (nl_catd) -1; + nlspath = NLSPATH; + + nlspath_len = sizeof NLSPATH; } } - else - { - result->env_var = NULL; - result->nlspath = NULL; - } + + result = (__nl_catd) malloc (sizeof (*result) + cat_name_len + + env_var_len + nlspath_len); + if (result == NULL) + /* We cannot get enough memory. */ + return (nl_catd) -1; + + result->status = closed; + result->cat_name = endp = (char *) (result + 1); + endp = __mempcpy (endp, cat_name, cat_name_len); + + result->env_var = cat_name_len != 0 ? endp : NULL; + endp = __mempcpy (endp, env_var, env_var_len); + + result->nlspath = nlspath_len != 0 ? endp : NULL; + memcpy (endp, nlspath, nlspath_len); __libc_lock_init (result->lock); @@ -179,10 +162,6 @@ catclose (nl_catd catalog_desc) return -1; } - if (catalog->nlspath) - free ((void *) catalog->nlspath); - if (catalog->env_var) - free ((void *) catalog->env_var); free ((void *) catalog); return 0; diff --git a/catgets/open_catalog.c b/catgets/open_catalog.c index e4b61d7..4b619e4 100644 --- a/catgets/open_catalog.c +++ b/catgets/open_catalog.c @@ -1,6 +1,6 @@ -/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. + Contributed by Ulrich Drepper, <drepper@gnu.org>. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as @@ -182,10 +182,13 @@ __open_catalog (__nl_catd catalog) } /* Avoid dealing with directories and block devices */ - if (fd < 0 || __fstat (fd, &st) < 0) + if (fd < 0) + goto unlock_return; + + if (__fxstat (_STAT_VER, fd, &st) < 0) { catalog->status = nonexisting; - goto unlock_return; + goto close_unlock_return; } if (!S_ISREG (st.st_mode) || st.st_size < sizeof (struct catalog_obj)) { @@ -193,7 +196,7 @@ __open_catalog (__nl_catd catalog) Use an reasonable error value. */ __set_errno (EINVAL); catalog->status = nonexisting; - goto unlock_return; + goto close_unlock_return; } catalog->file_size = st.st_size; @@ -226,7 +229,7 @@ __open_catalog (__nl_catd catalog) if (catalog->file_ptr == NULL) { catalog->status = nonexisting; - goto unlock_return; + goto close_unlock_return; } todo = st.st_size; /* Save read, handle partial reads. */ @@ -238,7 +241,7 @@ __open_catalog (__nl_catd catalog) { free ((void *) catalog->file_ptr); catalog->status = nonexisting; - goto unlock_return; + goto close_unlock_return; } todo -= now; } @@ -246,10 +249,6 @@ __open_catalog (__nl_catd catalog) catalog->status = malloced; } - /* We don't need the file anymore. */ - __close (fd); - fd = -1; - /* Determine whether the file is a catalog file and if yes whether it is written using the correct byte order. Else we have to swap the values. */ @@ -269,7 +268,7 @@ __open_catalog (__nl_catd catalog) #endif /* _POSIX_MAPPED_FILES */ free (catalog->file_ptr); catalog->status = nonexisting; - goto unlock_return; + goto close_unlock_return; } #define SWAP(x) (swapping ? SWAPU32 (x) : (x)) @@ -320,8 +319,8 @@ __open_catalog (__nl_catd catalog) } /* Release the lock again. */ + close_unlock_return: + __close (fd); unlock_return: - if (fd != -1) - __close (fd); __libc_lock_unlock (catalog->lock); } |