aboutsummaryrefslogtreecommitdiff
path: root/gdb/tracepoint.c
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2018-03-22 00:26:37 -0400
committerSimon Marchi <simon.marchi@ericsson.com>2018-03-22 00:26:39 -0400
commit62c222b6d9fcce8adf65f48fca2e528f777afeeb (patch)
treef15b2f3b4428b7408844225be9a4e0e7096df8c6 /gdb/tracepoint.c
parent92c00f4228afac1bead526bf63aca42581d4c858 (diff)
downloadgdb-62c222b6d9fcce8adf65f48fca2e528f777afeeb.zip
gdb-62c222b6d9fcce8adf65f48fca2e528f777afeeb.tar.gz
gdb-62c222b6d9fcce8adf65f48fca2e528f777afeeb.tar.bz2
Make parse_static_tracepoint_marker_definition work with multiple static tracepoint definitions
Since I modify the parse_static_tracepoint_marker_definition function in the next patch, I wanted to write a unit test for it. Doing so showed that it doesn't handle multiple consecutive static tracepoint definitions separated by commas. However, the RSP documentation [1] states that servers may return multiple definitions, like: 1234:6d61726b657231:6578747261207374756666,abba:6d61726b657232: The problem is that the function uses strlen to compute the length of the last field (the extra field). If there are additional definitions in addition to the one we are currently parsing, the returned length will include those definitions, and we'll try to hex-decode past the extra field. This patch changes parse_static_tracepoint_marker_definition to consider the case where the current definition is followed by a comma and more definitions. It also adds the unit test that found the issue in the first place. I don't think this causes any backwards compatibility issues, because the previous code only handled single static tracepoint definitions, and the new code handles that correctly. gdb/ChangeLog: * tracepoint.c (parse_static_tracepoint_marker_definition): Consider case where the definition is followed by more definitions. * Makefile.in (SUBDIR_UNITTESTS_SRCS): Add tracepoint-selftests.c. * unittests/tracepoint-selftests.c: New. [1] https://sourceware.org/gdb/onlinedocs/gdb/Tracepoint-Packets.html#qTfSTM
Diffstat (limited to 'gdb/tracepoint.c')
-rw-r--r--gdb/tracepoint.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 30fe206..8e779bc 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -3720,12 +3720,20 @@ parse_static_tracepoint_marker_definition (const char *line, const char **pp,
p += 2 * end;
p++; /* skip a colon */
- marker->extra = (char *) xmalloc (strlen (p) + 1);
- end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
+ /* This definition may be followed by another one, separated by a comma. */
+ int hex_len;
+ endp = strchr (p, ',');
+ if (endp != nullptr)
+ hex_len = endp - p;
+ else
+ hex_len = strlen (p);
+
+ marker->extra = (char *) xmalloc (hex_len / 2 + 1);
+ end = hex2bin (p, (gdb_byte *) marker->extra, hex_len / 2);
marker->extra[end] = '\0';
if (pp)
- *pp = p;
+ *pp = p + hex_len;
}
/* Release a static tracepoint marker's contents. Note that the