From: Bruno Haible Date: Sat, 30 Sep 2023 18:03:47 +0000 (+0200) Subject: intl: Remove use of alloca() for wdirname handling. X-Git-Tag: v0.23~358 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6be678fd31c4127c858fea41c94cf1b5d8ea55ae;p=thirdparty%2Fgettext.git intl: Remove use of alloca() for wdirname handling. * autogen.sh (GNULIB_MODULES_LIBINTL): Add wgetcwd-lgpl. * gettext-runtime/intl/dcigettext.c: Include . (DCIGETTEXT): Allocate resolved_wdirname through malloc() instead of through alloca(). --- diff --git a/autogen.sh b/autogen.sh index 2981a4e49..44594a84d 100755 --- a/autogen.sh +++ b/autogen.sh @@ -125,6 +125,7 @@ if ! $skip_gnulib; then tsearch vasnprintf-posix vasnwprintf-posix + wgetcwd-lgpl ' GNULIB_SETLOCALE_DEPENDENCIES=`$GNULIB_TOOL --extract-dependencies setlocale | sed -e 's/ .*//'` $GNULIB_TOOL --dir=gettext-runtime/intl --source-base=gnulib-lib --m4-base=gnulib-m4 --lgpl=2 --libtool --local-dir=gnulib-local --local-symlink \ diff --git a/gettext-runtime/intl/dcigettext.c b/gettext-runtime/intl/dcigettext.c index 0ba129d58..242dd5192 100644 --- a/gettext-runtime/intl/dcigettext.c +++ b/gettext-runtime/intl/dcigettext.c @@ -61,6 +61,7 @@ extern int errno; #include #include #include +#include #if defined HAVE_UNISTD_H || defined _LIBC # include @@ -612,10 +613,6 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, { /* We have a relative path. Make it absolute now. */ size_t wdirname_len; - size_t path_max; - wchar_t *resolved_wdirname; - wchar_t *ret; - wchar_t *p; if (wdirname != NULL) wdirname_len = wcslen (wdirname); @@ -624,45 +621,41 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, wdirname_len = mbstowcs (NULL, dirname, 0); if (wdirname_len == (size_t)(-1)) - /* dirname contains invalid multibyte characters. Don't signal - an error but simply return the default string. */ + /* dirname contains invalid multibyte characters. Don't + signal an error but simply return the default string. */ goto return_untranslated; } wdirname_len++; - path_max = (unsigned int) PATH_MAX; - path_max += 2; /* The getcwd docs say to do this. */ + wchar_t *wcwd = wgetcwd (NULL, 0); + if (wcwd == NULL) + /* We cannot get the current working directory. Don't + signal an error but simply return the default string. */ + goto return_untranslated; + size_t wcwd_len = wcslen (wcwd); - for (;;) + wchar_t *resolved_wdirname = + (wchar_t *) + malloc ((wcwd_len + 1 + wdirname_len) * sizeof (wchar_t)); + if (resolved_wdirname == NULL) { - resolved_wdirname = - (wchar_t *) - alloca ((path_max + wdirname_len) * sizeof (wchar_t)); - ADD_BLOCK (block_list, resolved_wdirname); - - __set_errno (0); - ret = _wgetcwd (resolved_wdirname, path_max); - if (ret != NULL || errno != ERANGE) - break; - - path_max += path_max / 2; - path_max += PATH_INCR; + /* Memory allocation failure. Don't signal an error + but simply return the default string. */ + free (wcwd); + goto return_untranslated; } - - if (ret == NULL) - /* We cannot get the current working directory. Don't signal an - error but simply return the default string. */ - goto return_untranslated; - - p = wcschr (resolved_wdirname, L'\0'); - *p++ = L'/'; + wmemcpy (resolved_wdirname, wcwd, wcwd_len); + resolved_wdirname[wcwd_len] = L'/'; if (wdirname != NULL) - wcscpy (p, wdirname); + wmemcpy (resolved_wdirname + wcwd_len + 1, wdirname, wdirname_len); else - mbstowcs (p, dirname, wdirname_len); + mbstowcs (resolved_wdirname + wcwd_len + 1, dirname, wdirname_len); + + free (wcwd); wdirname = resolved_wdirname; dirname = NULL; + xdirname = (char *) resolved_wdirname; } #else if (IS_RELATIVE_FILE_NAME (dirname))