87 lines
3.2 KiB
Text
87 lines
3.2 KiB
Text
Index: gettext-runtime/intl/dcigettext.c
|
|
--- gettext-runtime/intl/dcigettext.c.orig
|
|
+++ gettext-runtime/intl/dcigettext.c
|
|
@@ -476,6 +476,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1
|
|
const char *localename;
|
|
#endif
|
|
size_t domainname_len;
|
|
+ size_t xdomainname_len;
|
|
|
|
/* If no real MSGID is given return NULL. */
|
|
if (msgid1 == NULL)
|
|
@@ -667,6 +668,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1
|
|
/* We have a relative path. Make it absolute now. */
|
|
size_t dirname_len = strlen (dirname) + 1;
|
|
size_t path_max;
|
|
+ size_t resolved_dirname_len;
|
|
char *resolved_dirname;
|
|
char *ret;
|
|
|
|
@@ -675,7 +677,8 @@ DCIGETTEXT (const char *domainname, const char *msgid1
|
|
|
|
for (;;)
|
|
{
|
|
- resolved_dirname = (char *) alloca (path_max + dirname_len);
|
|
+ resolved_dirname_len = path_max + dirname_len;
|
|
+ resolved_dirname = (char *) alloca (resolved_dirname_len);
|
|
ADD_BLOCK (block_list, resolved_dirname);
|
|
|
|
__set_errno (0);
|
|
@@ -692,7 +695,8 @@ DCIGETTEXT (const char *domainname, const char *msgid1
|
|
error but simply return the default string. */
|
|
goto return_untranslated;
|
|
|
|
- stpcpy (stpcpy (strchr (resolved_dirname, '\0'), "/"), dirname);
|
|
+ strlcat (resolved_dirname, "/", resolved_dirname_len);
|
|
+ strlcat (resolved_dirname, dirname, resolved_dirname_len);
|
|
dirname = resolved_dirname;
|
|
}
|
|
#endif
|
|
@@ -711,13 +715,14 @@ DCIGETTEXT (const char *domainname, const char *msgid1
|
|
#endif
|
|
|
|
domainname_len = strlen (domainname);
|
|
- xdomainname = (char *) alloca (strlen (categoryname)
|
|
- + domainname_len + 5);
|
|
+ xdomainname_len = strlen (categoryname) + domainname_len + 5;
|
|
+ xdomainname = (char *) alloca (xdomainname_len);
|
|
ADD_BLOCK (block_list, xdomainname);
|
|
|
|
- stpcpy ((char *) mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
|
|
- domainname, domainname_len),
|
|
- ".mo");
|
|
+ strlcpy (xdomainname, categoryname, xdomainname_len);
|
|
+ strlcat (xdomainname, "/", xdomainname_len);
|
|
+ strlcat (xdomainname, domainname, xdomainname_len);
|
|
+ strlcat (xdomainname, ".mo", xdomainname_len);
|
|
|
|
/* Creating working area. */
|
|
single_locale = (char *) alloca (strlen (categoryvalue) + 1);
|
|
@@ -819,13 +824,17 @@ DCIGETTEXT (const char *domainname, const char *msgid1
|
|
/* Create a new entry and add it to the search tree. */
|
|
size_t msgid_len;
|
|
size_t size;
|
|
+#ifdef HAVE_PER_THREAD_LOCALE
|
|
+ size_t localename_len;
|
|
+#endif
|
|
struct known_translation_t *newp;
|
|
|
|
msgid_len = strlen (msgid1) + 1;
|
|
size = offsetof (struct known_translation_t, msgid)
|
|
+ msgid_len + domainname_len + 1;
|
|
#ifdef HAVE_PER_THREAD_LOCALE
|
|
- size += strlen (localename) + 1;
|
|
+ localename_len = strlen (localename);
|
|
+ size += localename_len + 1;
|
|
#endif
|
|
newp = (struct known_translation_t *) malloc (size);
|
|
if (newp != NULL)
|
|
@@ -841,7 +850,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1
|
|
memcpy (new_domainname, domainname, domainname_len + 1);
|
|
#ifdef HAVE_PER_THREAD_LOCALE
|
|
new_localename = new_domainname + domainname_len + 1;
|
|
- strcpy (new_localename, localename);
|
|
+ memcpy (new_localename, localename, localename_len + 1);
|
|
#endif
|
|
newp->domainname = new_domainname;
|
|
newp->category = category;
|