Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Pierre Muller" <muller@ics.u-strasbg.fr>
To: <gdb-patches@sourceware.org>
Subject: [RFC] Ada ARI fix for sprintf
Date: Tue, 07 Apr 2009 08:09:00 -0000	[thread overview]
Message-ID: <000401c9b758$2c1cf4b0$8456de10$@u-strasbg.fr> (raw)

The reason this is a RFC rather than a RFA
is that I used another function than
the one recommended on ARI page.

Currently AR Index gives 153 failures for "sprint" rule.
sprintf	153	Do not use sprintf, instead use xstrprintf
But they seem to all have local static buffers
whereas xstrprintf allocates memory globally.

  I propose to use xsnprintf instead for such case,
which checks for buffer overflow.

  If you agree, I will also update the
ARI recommendation.

All comments welcome,


Pierre Muller
Pascal language support maintainer for GDB




2009-04-07  Pierre Muller  <muller.u-strasbg.fr²>

	ARI fix: sprintf rule.
	* ada-exp.y (convert_char_literal): Replace sprintf by xsnprintf.
	* ada-lang.c (add_angle_bracket): Ditto.
	(ada_decode, find_old_style_renaming_symbol): Ditto.
	(ada_to_fixed_type_1, ada_enum_name): Ditto.

Index: ada-exp.y
===================================================================
RCS file: /cvs/src/src/gdb/ada-exp.y,v
retrieving revision 1.36
diff -u -p -r1.36 ada-exp.y
--- ada-exp.y	24 Mar 2009 02:08:23 -0000	1.36
+++ ada-exp.y	7 Apr 2009 08:01:25 -0000
@@ -1452,7 +1452,7 @@ convert_char_literal (struct type *type,
 
   if (type == NULL || TYPE_CODE (type) != TYPE_CODE_ENUM)
     return val;
-  sprintf (name, "QU%02x", (int) val);
+  xsnprintf (name, sizeof (name), "QU%02x", (int) val);
   for (f = 0; f < TYPE_NFIELDS (type); f += 1)
     {
       if (strcmp (name, TYPE_FIELD_NAME (type, f)) == 0)
Index: ada-lang.c
===================================================================
RCS file: /cvs/src/src/gdb/ada-lang.c,v
retrieving revision 1.205
diff -u -p -r1.205 ada-lang.c
--- ada-lang.c	24 Mar 2009 02:07:06 -0000	1.205
+++ ada-lang.c	7 Apr 2009 08:01:28 -0000
@@ -335,11 +335,13 @@ static char *
 add_angle_brackets (const char *str)
 {
   static char *result = NULL;
+  int result_size;
 
   xfree (result);
-  result = (char *) xmalloc ((strlen (str) + 3) * sizeof (char));
+  result_size = (strlen (str) + 3) * sizeof (char);
+  result = (char *) xmalloc (result_size);
 
-  sprintf (result, "<%s>", str);
+  xsnprintf (result, result_size, "<%s>", str);
   return result;
 }
 
@@ -1114,7 +1116,7 @@ Suppress:
   if (encoded[0] == '<')
     strcpy (decoded, encoded);
   else
-    sprintf (decoded, "<%s>", encoded);
+    xsnprintf (decoded, decoding_buffer_size, "<%s>", encoded);
   return decoded;
 
 }
@@ -6609,13 +6611,14 @@ find_old_style_renaming_symbol (const ch
         function_name = function_name + 5;
 
       rename = (char *) alloca (rename_len * sizeof (char));
-      sprintf (rename, "%s__%s___XR", function_name, name);
+      xsnprintf (rename, rename_len * sizeof (char), "%s__%s___XR", 
+		 function_name, name);
     }
   else
     {
       const int rename_len = strlen (name) + 6;
       rename = (char *) alloca (rename_len * sizeof (char));
-      sprintf (rename, "%s___XR", name);
+      xsnprintf (rename, rename_len * sizeof (char), "%s___XR", name);
     }
 
   return ada_find_any_symbol (rename);
@@ -7308,7 +7311,7 @@ ada_to_fixed_type_1 (struct type *type, 
             int xvz_found = 0;
             LONGEST size;
 
-            sprintf (xvz_name, "%s___XVZ", name);
+            xsnprintf (xvz_name, strlen (name) + 7, "%s___XVZ", name);
             size = get_int_var_value (xvz_name, &xvz_found);
             if (xvz_found && TYPE_LENGTH (fixed_record_type) != size)
               {
@@ -7760,11 +7763,11 @@ ada_enum_name (const char *name)
 
       GROW_VECT (result, result_len, 16);
       if (isascii (v) && isprint (v))
-        sprintf (result, "'%c'", v);
+        xsnprintf (result, result_len, "'%c'", v);
       else if (name[1] == 'U')
-        sprintf (result, "[\"%02x\"]", v);
+        xsnprintf (result, result_len, "[\"%02x\"]", v);
       else
-        sprintf (result, "[\"%04x\"]", v);
+        xsnprintf (result, result_len, "[\"%04x\"]", v);
 
       return result;
     }


             reply	other threads:[~2009-04-07  8:09 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-07  8:09 Pierre Muller [this message]
2009-04-11 15:19 ` Pedro Alves
2009-04-14 18:24   ` Joel Brobecker
2009-04-14 18:39     ` [RFA] Ada ARI fix for sprintf version 2 Pierre Muller
2009-04-14 18:56       ` Joel Brobecker
2009-04-14 19:22         ` Pierre Muller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='000401c9b758$2c1cf4b0$8456de10$@u-strasbg.fr' \
    --to=muller@ics.u-strasbg.fr \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox