]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
DCIGETTEXT: Use getcwd, asprintf to construct absolute pathname
authorFlorian Weimer <fweimer@redhat.com>
Wed, 21 Jun 2017 14:31:31 +0000 (16:31 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Wed, 21 Jun 2017 14:31:31 +0000 (16:31 +0200)
ChangeLog
intl/dcigettext.c

index 22889ee2e8376602d6ad9b3035a1395424a5aabf..2d07c200fe374f155af22b6536b9cbbfc43075ef 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-06-21  Florian Weimer  <fweimer@redhat.com>
+
+       * intl/dcigettext.c (DCIGETTEXT): Use getcwd (NULL, 0) and
+       asprintf to construct an absolute pathname.
+
 2017-06-21  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
        * misc/tst-preadvwritev2-common.c: New file.
index d97746cae5e3cd401bca9160e0f2130226bb46ea..f63b34b0f5d66a234835753995e60ced0af603a9 100644 (file)
@@ -59,6 +59,7 @@ extern int errno;
 
 #include <stddef.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <string.h>
 
 #if defined HAVE_UNISTD_H || defined _LIBC
@@ -495,6 +496,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
   const char *categoryname;
   const char *categoryvalue;
   const char *dirname;
+  char *xdirname = NULL;
   char *xdomainname;
   char *single_locale;
   char *retval;
@@ -624,35 +626,17 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
       if (!IS_ABSOLUTE_PATH (dirname))
        {
          /* We have a relative path.  Make it absolute now.  */
-         size_t dirname_len = strlen (dirname) + 1;
-         size_t path_max;
-         char *resolved_dirname;
-         char *ret;
-
-         path_max = (unsigned int) PATH_MAX;
-         path_max += 2;                /* The getcwd docs say to do this.  */
-
-         for (;;)
-           {
-             resolved_dirname = (char *) alloca (path_max + dirname_len);
-             ADD_BLOCK (block_list, tmp_dirname);
-
-             __set_errno (0);
-             ret = getcwd (resolved_dirname, path_max);
-             if (ret != NULL || errno != ERANGE)
-               break;
-
-             path_max += path_max / 2;
-             path_max += PATH_INCR;
-           }
-
-         if (ret == NULL)
-           /* We cannot get the current working directory.  Don't signal an
-              error but simply return the default string.  */
+         char *cwd = getcwd (NULL, 0);
+         if (cwd == NULL)
+           /* We cannot get the current working directory.  Don't
+              signal an error but simply return the default
+              string.  */
            goto return_untranslated;
-
-         stpcpy (stpcpy (strchr (resolved_dirname, '\0'), "/"), dirname);
-         dirname = resolved_dirname;
+         int ret = __asprintf (&xdirname, "%s/%s", cwd, dirname);
+         free (cwd);
+         if (ret < 0)
+             return NULL;
+         dirname = xdirname;
        }
 #ifndef IN_LIBGLOCALE
     }
@@ -767,6 +751,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
            {
              /* Found the translation of MSGID1 in domain DOMAIN:
                 starting at RETVAL, RETLEN bytes.  */
+             free (xdirname);
              FREE_BLOCKS (block_list);
              if (foundp == NULL)
                {
@@ -850,6 +835,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
 
  return_untranslated:
   /* Return the untranslated MSGID.  */
+  free (xdirname);
   FREE_BLOCKS (block_list);
   gl_rwlock_unlock (_nl_state_lock);
 #ifdef _LIBC