aboutsummaryrefslogtreecommitdiff
path: root/gdb/c-exp.y
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2008-06-25 15:49:20 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2008-06-25 15:49:20 +0000
commitfe9441f601347a780ae356cd935aef2d37b824ee (patch)
tree60b5ba44d88c627c679fee814c9860e15ec76646 /gdb/c-exp.y
parent2c40eaebf8d01330b1ee59a262d651fbd5192f32 (diff)
downloadgdb-fe9441f601347a780ae356cd935aef2d37b824ee.zip
gdb-fe9441f601347a780ae356cd935aef2d37b824ee.tar.gz
gdb-fe9441f601347a780ae356cd935aef2d37b824ee.tar.bz2
Fix a memory leak found by Hui Zhu <teawater@gmail.com>.
* c-exp.y (parse_number): Move the S and SAVED_CHAR initialization after the DECFLOAT detection to fix a memory leak. Remove the redundant NUM initialization. Protect the DECFLOAT detection memory access before the P block. Restore the P memory content for the DECFLOAT detection.
Diffstat (limited to 'gdb/c-exp.y')
-rw-r--r--gdb/c-exp.y29
1 files changed, 15 insertions, 14 deletions
diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 0f2ee16..bd04dc2 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -1118,45 +1118,46 @@ parse_number (p, len, parsed_float, putithere)
if (parsed_float)
{
/* It's a float since it contains a point or an exponent. */
- char *s = malloc (len);
- int num = 0; /* number of tokens scanned by scanf */
- char saved_char = p[len];
-
- p[len] = 0; /* null-terminate the token */
+ char *s;
+ int num; /* number of tokens scanned by scanf */
+ char saved_char;
/* If it ends at "df", "dd" or "dl", take it as type of decimal floating
point. Return DECFLOAT. */
- if (p[len - 2] == 'd' && p[len - 1] == 'f')
+ if (len >= 2 && p[len - 2] == 'd' && p[len - 1] == 'f')
{
p[len - 2] = '\0';
putithere->typed_val_decfloat.type
= builtin_type (current_gdbarch)->builtin_decfloat;
decimal_from_string (putithere->typed_val_decfloat.val, 4, p);
- p[len] = saved_char;
- return (DECFLOAT);
+ p[len - 2] = 'd';
+ return DECFLOAT;
}
- if (p[len - 2] == 'd' && p[len - 1] == 'd')
+ if (len >= 2 && p[len - 2] == 'd' && p[len - 1] == 'd')
{
p[len - 2] = '\0';
putithere->typed_val_decfloat.type
= builtin_type (current_gdbarch)->builtin_decdouble;
decimal_from_string (putithere->typed_val_decfloat.val, 8, p);
- p[len] = saved_char;
- return (DECFLOAT);
+ p[len - 2] = 'd';
+ return DECFLOAT;
}
- if (p[len - 2] == 'd' && p[len - 1] == 'l')
+ if (len >= 2 && p[len - 2] == 'd' && p[len - 1] == 'l')
{
p[len - 2] = '\0';
putithere->typed_val_decfloat.type
= builtin_type (current_gdbarch)->builtin_declong;
decimal_from_string (putithere->typed_val_decfloat.val, 16, p);
- p[len] = saved_char;
- return (DECFLOAT);
+ p[len - 2] = 'd';
+ return DECFLOAT;
}
+ s = malloc (len);
+ saved_char = p[len];
+ p[len] = 0; /* null-terminate the token */
num = sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%s",
&putithere->typed_val_float.dval, s);
p[len] = saved_char; /* restore the input stream */