* valarith.c (value_concat): Replace unsafe ALLOCA with
authorSiddhesh Poyarekar <siddhesh@sourceware.org>
Fri, 14 Sep 2012 12:46:55 +0000 (12:46 +0000)
committerSiddhesh Poyarekar <siddhesh@sourceware.org>
Fri, 14 Sep 2012 12:46:55 +0000 (12:46 +0000)
XMALLOC/XFREE.

gdb/ChangeLog
gdb/valarith.c

index ecf7d2286b7940a060cb3a99ad225092ea7b6454..beaa8c225873f33869b6b5217a58b91861e6bfaf 100644 (file)
@@ -1,3 +1,8 @@
+2012-09-14  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+       * valarith.c (value_concat): Replace unsafe ALLOCA with
+       XMALLOC/XFREE.
+
 2012-09-14  Pedro Alves  <palves@redhat.com>
 
        * gdb.1 (SEE ALSO): Expand pointer to GDB's Texinfo manual.
index 6858d2b6c64dddcc4b3681cecd6c07ce5cdc4cbe..c457f4a63095411ee092355c73afaa5e44cc8dae 100644 (file)
@@ -668,9 +668,12 @@ value_concat (struct value *arg1, struct value *arg2)
       if (TYPE_CODE (type2) == TYPE_CODE_STRING
          || TYPE_CODE (type2) == TYPE_CODE_CHAR)
        {
+         struct cleanup *back_to;
+
          count = longest_to_int (value_as_long (inval1));
          inval2len = TYPE_LENGTH (type2);
-         ptr = (char *) alloca (count * inval2len);
+         ptr = (char *) xmalloc (count * inval2len);
+         back_to = make_cleanup (xfree, ptr);
          if (TYPE_CODE (type2) == TYPE_CODE_CHAR)
            {
              char_type = type2;
@@ -693,6 +696,7 @@ value_concat (struct value *arg1, struct value *arg2)
                }
            }
          outval = value_string (ptr, count * inval2len, char_type);
+         do_cleanups (back_to);
        }
       else if (TYPE_CODE (type2) == TYPE_CODE_BOOL)
        {
@@ -706,6 +710,8 @@ value_concat (struct value *arg1, struct value *arg2)
   else if (TYPE_CODE (type1) == TYPE_CODE_STRING
           || TYPE_CODE (type1) == TYPE_CODE_CHAR)
     {
+      struct cleanup *back_to;
+
       /* We have two character strings to concatenate.  */
       if (TYPE_CODE (type2) != TYPE_CODE_STRING
          && TYPE_CODE (type2) != TYPE_CODE_CHAR)
@@ -714,7 +720,8 @@ value_concat (struct value *arg1, struct value *arg2)
        }
       inval1len = TYPE_LENGTH (type1);
       inval2len = TYPE_LENGTH (type2);
-      ptr = (char *) alloca (inval1len + inval2len);
+      ptr = (char *) xmalloc (inval1len + inval2len);
+      back_to = make_cleanup (xfree, ptr);
       if (TYPE_CODE (type1) == TYPE_CODE_CHAR)
        {
          char_type = type1;
@@ -737,6 +744,7 @@ value_concat (struct value *arg1, struct value *arg2)
          memcpy (ptr + inval1len, value_contents (inval2), inval2len);
        }
       outval = value_string (ptr, inval1len + inval2len, char_type);
+      do_cleanups (back_to);
     }
   else if (TYPE_CODE (type1) == TYPE_CODE_BOOL)
     {