From f380848e84613364a17008f04e91bfef09eaf158 Mon Sep 17 00:00:00 2001 From: Sterling Augustine Date: Fri, 22 Nov 2013 13:55:32 -0800 Subject: [PATCH] 2013-11-22 Sterling Augustine PR gdb/16196: * valprint.c (read_string): Set new variable fetchlen based on fetchlimit and size. Use it in call to partial_memory_read. Update comment. --- gdb/ChangeLog | 7 +++++++ gdb/valprint.c | 18 +++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0b8683dc5d..cd2a13681c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2013-11-22 Sterling Augustine + + PR backtrace/16196: + * valprint.c (read_string): Set new variable fetchlen based on + fetchlimit and size. Use it in call to partial_memory_read. + Update comment. + 2013-11-22 Tom Tromey PR backtrace/16155: diff --git a/gdb/valprint.c b/gdb/valprint.c index ea877f355f..ecc3411b6e 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -1757,11 +1757,13 @@ partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr, free, and BYTES_READ will be set to the number of bytes read. Returns 0 on success, or a target_xfer_error on failure. - If LEN > 0, reads exactly LEN characters (including eventual NULs in - the middle or end of the string). If LEN is -1, stops at the first - null character (not necessarily the first null byte) up to a maximum - of FETCHLIMIT characters. Set FETCHLIMIT to UINT_MAX to read as many - characters as possible from the string. + If LEN > 0, reads the lesser of LEN or FETCHLIMIT characters + (including eventual NULs in the middle or end of the string). + + If LEN is -1, stops at the first null character (not necessarily + the first null byte) up to a maximum of FETCHLIMIT characters. Set + FETCHLIMIT to UINT_MAX to read as many characters as possible from + the string. Unless an exception is thrown, BUFFER will always be allocated, even on failure. In this case, some characters might have been read before the @@ -1807,10 +1809,12 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit, if (len > 0) { - *buffer = (gdb_byte *) xmalloc (len * width); + unsigned int fetchlen = min (len, fetchlimit); + + *buffer = (gdb_byte *) xmalloc (fetchlen * width); bufptr = *buffer; - nfetch = partial_memory_read (addr, bufptr, len * width, &errcode) + nfetch = partial_memory_read (addr, bufptr, fetchlen * width, &errcode) / width; addr += nfetch * width; bufptr += nfetch * width; -- 2.34.1