]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
intl: Merge from glibc.
authorBruno Haible <bruno@clisp.org>
Sat, 30 Sep 2023 13:08:26 +0000 (15:08 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 30 Sep 2023 22:36:55 +0000 (00:36 +0200)
Apply commits
2017-06-21  Florian Weimer  <fweimer@redhat.com>
DCIGETTEXT: Use getcwd, asprintf to construct absolute pathname
and
2018-12-21  Florian Weimer  <fweimer@redhat.com>
intl: Do not return NULL on asprintf failure in gettext [BZ #24018]

gettext-runtime/intl/dcigettext.c

index c59c88a5783257244fc93e75a0f70c172fbd1f5c..9a6ae7b16e0346ac461c71ae5b92b2626b09fd4a 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
@@ -463,6 +464,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
   const char *categoryname;
   const char *categoryvalue;
   const char *dirname;
+  char *xdirname = NULL;
 #if defined _WIN32 && !defined __CYGWIN__
   const wchar_t *wdirname;
 #endif
@@ -666,35 +668,17 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
       if (IS_RELATIVE_FILE_NAME (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, resolved_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)
+           goto return_untranslated;
+         dirname = xdirname;
        }
 #endif
 #ifndef IN_LIBGLOCALE
@@ -815,6 +799,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)
                {
@@ -898,6 +883,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