luna-4672604.patch [plain text]
diff -upr ../gcc-4.0.0-baseline/libiberty/argv.c ./libiberty/argv.c
--- ../gcc-4.0.0-baseline/libiberty/argv.c 2003-04-15 13:36:33.000000000 -0700
+++ ./libiberty/argv.c 2006-08-18 11:10:07.000000000 -0700
@@ -100,7 +100,8 @@ dupargv (argv)
freeargv (copy);
return NULL;
}
- strcpy (copy[argc], argv[argc]);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcpy (copy[argc], argv[argc], sizeof (char *) * (len + 1));
}
copy[argc] = NULL;
return copy;
diff -upr ../gcc-4.0.0-baseline/libiberty/choose-temp.c ./libiberty/choose-temp.c
--- ../gcc-4.0.0-baseline/libiberty/choose-temp.c 2001-10-17 14:15:40.000000000 -0700
+++ ./libiberty/choose-temp.c 2006-08-18 11:10:08.000000000 -0700
@@ -62,8 +62,10 @@ choose_temp_base ()
len = strlen (base);
temp_filename = xmalloc (len + TEMP_FILE_LEN + 1);
- strcpy (temp_filename, base);
- strcpy (temp_filename + len, TEMP_FILE);
+ /* LUNA LOCAL begin don't use unbounded string writes */
+ strlcpy (temp_filename, base, len + TEMP_FILE_LEN + 1);
+ strlcpy (temp_filename + len, TEMP_FILE, TEMP_FILE_LEN + 1);
+ /* LUNA LOCAL end don't use unbounded string writes */
mktemp (temp_filename);
if (strlen (temp_filename) == 0)
diff -upr ../gcc-4.0.0-baseline/libiberty/cp-demangle.c ./libiberty/cp-demangle.c
--- ../gcc-4.0.0-baseline/libiberty/cp-demangle.c 2005-02-12 22:58:20.000000000 -0800
+++ ./libiberty/cp-demangle.c 2006-08-18 11:10:08.000000000 -0700
@@ -161,6 +161,7 @@ d_init_info PARAMS ((const char *, int,
#endif /* defined (__STDC__) */
#endif /* ! defined (__GNUC__) */
+/* LUNA LOCAL begin don't use unbounded string writes */
/* We avoid pulling in the ctype tables, to prevent pulling in
additional unresolved symbols when this code is used in a library.
FIXME: Is this really a valid reason? This comes from the original
@@ -168,7 +169,8 @@ d_init_info PARAMS ((const char *, int,
As of this writing this file has the following undefined references
when compiled with -DIN_GLIBCPP_V3: malloc, realloc, free, memcpy,
- strcpy, strcat, strlen. */
+ strlcpy, strlcat, strlen. */
+/* LUNA LOCAL end don't use unbounded string writes */
#define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
#define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
@@ -3891,20 +3893,23 @@ d_demangle (mangled, options, palc)
&& (mangled[9] == 'D' || mangled[9] == 'I')
&& mangled[10] == '_')
{
+ /* LUNA LOCAL begin don't use unbounded string writes */
char *r;
+ size_t r_len = 40 + len - 11;
- r = malloc (40 + len - 11);
+ r = malloc (r_len);
if (r == NULL)
*palc = 1;
else
{
if (mangled[9] == 'I')
- strcpy (r, "global constructors keyed to ");
+ strlcpy (r, "global constructors keyed to ", r_len);
else
- strcpy (r, "global destructors keyed to ");
- strcat (r, mangled + 11);
+ strlcpy (r, "global destructors keyed to ", r_len);
+ strlcat (r, mangled + 11, r_len);
}
return r;
+ /* LUNA LOCAL end don't use unbounded string writes */
}
else
{
@@ -4070,7 +4075,8 @@ __cxa_demangle (mangled_name, output_buf
{
if (strlen (demangled) < *length)
{
- strcpy (output_buffer, demangled);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcpy (output_buffer, demangled, *length);
free (demangled);
demangled = output_buffer;
}
diff -upr ../gcc-4.0.0-baseline/libiberty/cplus-dem.c ./libiberty/cplus-dem.c
--- ../gcc-4.0.0-baseline/libiberty/cplus-dem.c 2004-11-23 18:19:10.000000000 -0800
+++ ./libiberty/cplus-dem.c 2006-08-18 11:10:08.000000000 -0700
@@ -682,6 +682,8 @@ demangle_qualifier (c)
return qualifier_string (code_for_qualifier (c));
}
+/* LUNA LOCAL don't use unbounded string writes */
+#if 0 /* Not needed for libstdc++, and introduces strcat dependencies. */
int
cplus_demangle_opname (opname, result, options)
const char *opname;
@@ -811,6 +813,8 @@ cplus_demangle_opname (opname, result, o
return ret;
}
+/* LUNA LOCAL don't use unbounded string writes */
+#endif
/* Takes operator name as e.g. "++" and returns mangled
operator name (e.g. "postincrement_expr"), or NULL if not found.
@@ -1059,7 +1063,8 @@ ada_demangle (mangled, option)
sizeof (char));
if (mangled[0] == '<')
- strcpy (demangled, mangled);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcpy (demangled, mangled, demangled_size);
else
sprintf (demangled, "<%s>", mangled);
diff -upr ../gcc-4.0.0-baseline/libiberty/dyn-string.c ./libiberty/dyn-string.c
--- ../gcc-4.0.0-baseline/libiberty/dyn-string.c 2004-02-23 18:32:50.000000000 -0800
+++ ./libiberty/dyn-string.c 2006-08-18 11:10:08.000000000 -0700
@@ -200,7 +200,8 @@ dyn_string_copy (dest, src)
if (dyn_string_resize (dest, src->length) == NULL)
return 0;
/* Copy DEST into SRC. */
- strcpy (dest->s, src->s);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcpy (dest->s, src->s, dest->allocated);
/* Update the size of DEST. */
dest->length = src->length;
return 1;
@@ -220,7 +221,8 @@ dyn_string_copy_cstr (dest, src)
if (dyn_string_resize (dest, length) == NULL)
return 0;
/* Copy DEST into SRC. */
- strcpy (dest->s, src);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcpy (dest->s, src, dest->allocated);
/* Update the size of DEST. */
dest->length = length;
return 1;
@@ -340,7 +342,8 @@ dyn_string_append (dest, s)
{
if (dyn_string_resize (dest, dest->length + s->length) == 0)
return 0;
- strcpy (dest->s + dest->length, s->s);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcpy (dest->s + dest->length, s->s, dest->allocated - dest->length);
dest->length += s->length;
return 1;
}
@@ -360,7 +363,8 @@ dyn_string_append_cstr (dest, s)
one for the null at the end. */
if (dyn_string_resize (dest, dest->length + len) == NULL)
return 0;
- strcpy (dest->s + dest->length, s);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcpy (dest->s + dest->length, s, dest->allocated - dest->length);
dest->length += len;
return 1;
}
diff -upr ../gcc-4.0.0-baseline/libiberty/getcwd.c ./libiberty/getcwd.c
--- ../gcc-4.0.0-baseline/libiberty/getcwd.c 2003-04-15 13:36:33.000000000 -0700
+++ ./libiberty/getcwd.c 2006-08-18 11:10:08.000000000 -0700
@@ -58,7 +58,8 @@ getcwd (buf, len)
return 0;
}
}
- strcpy (buf, ourbuf);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcpy (buf, ourbuf, len);
}
return buf;
}
diff -upr ../gcc-4.0.0-baseline/libiberty/make-relative-prefix.c ./libiberty/make-relative-prefix.c
--- ../gcc-4.0.0-baseline/libiberty/make-relative-prefix.c 2003-02-20 14:10:58.000000000 -0800
+++ ./libiberty/make-relative-prefix.c 2006-08-18 11:10:08.000000000 -0700
@@ -248,10 +248,13 @@ make_relative_prefix (progname, bin_pref
{
char *startp, *endp, *nstore;
size_t prefixlen = strlen (temp) + 1;
+ /* LUNA LOCAL don't use unbounded string writes */
+ size_t nstore_size = prefixlen + strlen (progname) + 1;
if (prefixlen < 2)
prefixlen = 2;
- nstore = (char *) alloca (prefixlen + strlen (progname) + 1);
+ /* LUNA LOCAL don't use unbounded string writes */
+ nstore = (char *) alloca (nstore_size);
startp = endp = temp;
while (1)
@@ -275,7 +278,8 @@ make_relative_prefix (progname, bin_pref
else
nstore[endp - startp] = 0;
}
- strcat (nstore, progname);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcat (nstore, progname, nstore_size);
if (! access (nstore, X_OK)
#ifdef HAVE_HOST_EXECUTABLE_SUFFIX
|| ! access (strcat (nstore, HOST_EXECUTABLE_SUFFIX), X_OK)
@@ -372,13 +376,15 @@ make_relative_prefix (progname, bin_pref
/* Build up the pathnames in argv[0]. */
*ret = '\0';
for (i = 0; i < prog_num; i++)
- strcat (ret, prog_dirs[i]);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcat (ret, prog_dirs[i], needed_len);
/* Now build up the ..'s. */
ptr = ret + strlen(ret);
for (i = common; i < bin_num; i++)
{
- strcpy (ptr, DIR_UP);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcpy (ptr, DIR_UP, needed_len - (ptr - ret));
ptr += sizeof (DIR_UP) - 1;
*(ptr++) = DIR_SEPARATOR;
}
@@ -386,7 +392,8 @@ make_relative_prefix (progname, bin_pref
/* Put in directories to move over to prefix. */
for (i = common; i < prefix_num; i++)
- strcat (ret, prefix_dirs[i]);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcat (ret, prefix_dirs[i], needed_len);
free_split_directories (prog_dirs);
free_split_directories (bin_dirs);
diff -upr ../gcc-4.0.0-baseline/libiberty/make-temp-file.c ./libiberty/make-temp-file.c
--- ../gcc-4.0.0-baseline/libiberty/make-temp-file.c 2001-10-17 14:15:41.000000000 -0700
+++ ./libiberty/make-temp-file.c 2006-08-18 11:10:08.000000000 -0700
@@ -125,7 +125,8 @@ choose_tmpdir ()
and return it. */
len = strlen (base);
tmpdir = xmalloc (len + 2);
- strcpy (tmpdir, base);
+ /* LUNA LOCAL don't use unbounded string writes */
+ strlcpy (tmpdir, base, len + 2);
tmpdir[len] = DIR_SEPARATOR;
tmpdir[len+1] = '\0';
@@ -163,9 +164,17 @@ make_temp_file (suffix)
temp_filename = xmalloc (base_len
+ TEMP_FILE_LEN
+ suffix_len + 1);
- strcpy (temp_filename, base);
- strcpy (temp_filename + base_len, TEMP_FILE);
- strcpy (temp_filename + base_len + TEMP_FILE_LEN, suffix);
+ /* LUNA LOCAL begin don't use unbounded string writes */
+ strlcpy (temp_filename,
+ base,
+ base_len + TEMP_FILE_LEN + suffix_len + 1);
+ strlcpy (temp_filename + base_len,
+ TEMP_FILE,
+ TEMP_FILE_LEN + suffix_len + 1);
+ strlcpy (temp_filename + base_len + TEMP_FILE_LEN,
+ suffix,
+ suffix_len + 1);
+ /* LUNA LOCAL end don't use unbounded string writes */
fd = mkstemps (temp_filename, suffix_len);
/* If mkstemps failed, then something bad is happening. Maybe we should
diff -upr ../gcc-4.0.0-baseline/libstdc++-v3/config/locale/generic/c_locale.h ./libstdc++-v3/config/locale/generic/c_locale.h
--- ../gcc-4.0.0-baseline/libstdc++-v3/config/locale/generic/c_locale.h 2005-01-30 06:09:58.000000000 -0800
+++ ./libstdc++-v3/config/locale/generic/c_locale.h 2006-08-18 11:35:45.000000000 -0700
@@ -63,8 +63,16 @@ namespace std
char* __sav = NULL;
if (std::strcmp(__old, "C"))
{
+/* LUNA LOCAL begin don't use unbounded string writes */
+#if defined(_ANSI_SOURCE) || (defined(_POSIX_C_SOURCE) && ! defined(_DARWIN_C_SOURCE))
__sav = new char[std::strlen(__old) + 1];
std::strcpy(__sav, __old);
+#else
+ size_t __savlen = std::strlen(__old) + 1;
+ __sav = new char[__savlen];
+ ::strlcpy(__sav, __old, __savlen);
+#endif
+/* LUNA LOCAL end don't use unbounded string writes */
std::setlocale(LC_NUMERIC, "C");
}
diff -upr ../gcc-4.0.0-baseline/libstdc++-v3/config/locale/generic/time_members.h ./libstdc++-v3/config/locale/generic/time_members.h
--- ../gcc-4.0.0-baseline/libstdc++-v3/config/locale/generic/time_members.h 2003-10-02 16:06:12.000000000 -0700
+++ ./libstdc++-v3/config/locale/generic/time_members.h 2006-08-18 11:37:19.000000000 -0700
@@ -55,8 +55,16 @@
size_t __refs)
: facet(__refs), _M_data(NULL)
{
+/* LUNA LOCAL begin don't use unbounded string writes */
+#if defined(_ANSI_SOURCE) || (defined(_POSIX_C_SOURCE) && ! defined(_DARWIN_C_SOURCE))
char* __tmp = new char[std::strlen(__s) + 1];
std::strcpy(__tmp, __s);
+#else
+ size_t __tmplen = std::strlen(__s) + 1;
+ char* __tmp = new char[__tmplen];
+ ::strlcpy(__tmp, __s, __tmplen);
+#endif
+/* LUNA LOCAL end don't use unbounded string writes */
_M_name_timepunct = __tmp;
_M_initialize_timepunct(__cloc);
}
diff -upr ../gcc-4.0.0-baseline/libstdc++-v3/config/locale/gnu/c_locale.h ./libstdc++-v3/config/locale/gnu/c_locale.h
--- ../gcc-4.0.0-baseline/libstdc++-v3/config/locale/gnu/c_locale.h 2004-08-07 06:48:31.000000000 -0700
+++ ./libstdc++-v3/config/locale/gnu/c_locale.h 2006-08-18 14:33:03.000000000 -0700
@@ -75,8 +75,16 @@ namespace std
_Tv __v, const __c_locale&, int __prec)
{
char* __old = std::setlocale(LC_ALL, NULL);
+/* LUNA LOCAL begin don't use unbounded string writes */
+#if defined(_ANSI_SOURCE) || (defined(_POSIX_C_SOURCE) && ! defined(_DARWIN_C_SOURCE))
char* __sav = new char[std::strlen(__old) + 1];
std::strcpy(__sav, __old);
+#else
+ size_t __savlen = std::strlen(__old) + 1;
+ char* __sav = new char[__savlen];
+ ::strlcpy(__sav, __old, __savlen);
+#endif
+/* LUNA LOCAL end don't use unbounded string writes */
std::setlocale(LC_ALL, "C");
#endif
diff -upr ../gcc-4.0.0-baseline/libstdc++-v3/config/locale/gnu/messages_members.h ./libstdc++-v3/config/locale/gnu/messages_members.h
--- ../gcc-4.0.0-baseline/libstdc++-v3/config/locale/gnu/messages_members.h 2004-05-22 16:46:31.000000000 -0700
+++ ./libstdc++-v3/config/locale/gnu/messages_members.h 2006-08-18 11:41:28.000000000 -0700
@@ -46,8 +46,16 @@
: facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)),
_M_name_messages(__s)
{
+/* LUNA LOCAL begin don't use unbounded string writes */
+#if defined(_ANSI_SOURCE) || (defined(_POSIX_C_SOURCE) && ! defined(_DARWIN_C_SOURCE))
char* __tmp = new char[std::strlen(__s) + 1];
std::strcpy(__tmp, __s);
+#else
+ size_t __tmplen = std::strlen(__s) + 1;
+ char* __tmp = new char[__tmplen];
+ ::strlcpy(__tmp, __s, __tmplen);
+#endif
+/* LUNA LOCAL end don't use unbounded string writes */
_M_name_messages = __tmp;
}
@@ -92,8 +100,16 @@
{
if (this->_M_name_messages != locale::facet::_S_get_c_name())
delete [] this->_M_name_messages;
+/* LUNA LOCAL begin don't use unbounded string writes */
+#if defined(_ANSI_SOURCE) || (defined(_POSIX_C_SOURCE) && ! defined(_DARWIN_C_SOURCE))
char* __tmp = new char[std::strlen(__s) + 1];
std::strcpy(__tmp, __s);
+#else
+ size_t __tmplen = std::strlen(__s) + 1;
+ char* __tmp = new char[__tmplen];
+ std::strlcpy(__tmp, __s, __tmplen);
+#endif
+/* LUNA LOCAL end don't use unbounded string writes */
this->_M_name_messages = __tmp;
if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
diff -upr ../gcc-4.0.0-baseline/libstdc++-v3/config/locale/gnu/time_members.h ./libstdc++-v3/config/locale/gnu/time_members.h
--- ../gcc-4.0.0-baseline/libstdc++-v3/config/locale/gnu/time_members.h 2004-05-22 16:46:31.000000000 -0700
+++ ./libstdc++-v3/config/locale/gnu/time_members.h 2006-08-18 11:42:30.000000000 -0700
@@ -52,8 +52,16 @@
: facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL),
_M_name_timepunct(__s)
{
+* LUNA LOCAL begin don't use unbounded string writes */
+#if defined(_ANSI_SOURCE) || (defined(_POSIX_C_SOURCE) && ! defined(_DARWIN_C_SOURCE))
char* __tmp = new char[std::strlen(__s) + 1];
std::strcpy(__tmp, __s);
+#else
+ size_t __tmplen = std::strlen(__s) + 1;
+ char* __tmp = new char[__tmplen];
+ std::strlcpy(__tmp, __s, __tmplen);
+#endif
+/* LUNA LOCAL end don't use unbounded string writes */
_M_name_timepunct = __tmp;
_M_initialize_timepunct(__cloc);
}