summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Sixt <j6t@kdbg.org>2010-11-30 22:47:40 +0100
committerSlávek Banko <slavek.banko@axis.cz>2019-05-31 15:32:08 +0200
commit636663de42fc504919aa996e2f04b6f9ca1fb82e (patch)
treef1e782a32109721c24f20b3b7930ad9884825cab
parent147a454872687ca0e5438cc2a0deff7b8a60e744 (diff)
downloadkdbg-636663de42fc504919aa996e2f04b6f9ca1fb82e.tar.gz
kdbg-636663de42fc504919aa996e2f04b6f9ca1fb82e.zip
Grok gdb 7's <incomplete sequence> marker in strings.
When a string ends in an incomplete multi-byte sequence, gdb adds an <incomplete sequence...> fragment to the end of the string. Previously, this resulted in a parse error and incomplete variable information. Reported by Kevin Lemay. (cherry picked from upstream commit 03da8a5ec97c8c7b125b2bd453d2f1c3a018d477) (cherry picked from commit a8abc77457cda320f7577c2da7d6d592aaac0ca6)
-rw-r--r--kdbg/gdbdriver.cpp14
-rw-r--r--kdbg/testprogs/testfile.cpp19
2 files changed, 32 insertions, 1 deletions
diff --git a/kdbg/gdbdriver.cpp b/kdbg/gdbdriver.cpp
index ac86016..16efe9a 100644
--- a/kdbg/gdbdriver.cpp
+++ b/kdbg/gdbdriver.cpp
@@ -1048,7 +1048,8 @@ moreStrings:
}
}
// is the string continued?
- if (*p == ',') {
+ if (*p == ',')
+ {
// look ahead for another quote
const char* q = p+1;
while (isspace(*q))
@@ -1058,6 +1059,17 @@ moreStrings:
p = q;
goto moreStrings;
}
+
+ // some strings can end in <incomplete sequence ...>
+ if (strncmp(q, "<incomplete sequence", 20) == 0)
+ {
+ p = q+20;
+ while (*p != '\0' && *p != '>')
+ p++;
+ if (*p != '\0') {
+ p++; /* skip the '>' */
+ }
+ }
}
/* very long strings are followed by `...' */
if (*p == '.' && p[1] == '.' && p[2] == '.') {
diff --git a/kdbg/testprogs/testfile.cpp b/kdbg/testprogs/testfile.cpp
index 884ddad..242c504 100644
--- a/kdbg/testprogs/testfile.cpp
+++ b/kdbg/testprogs/testfile.cpp
@@ -101,6 +101,25 @@ void strtest(const char* t)
template<typename F>
void templated_strtest(F f, const char* t)
{
+ // test <incomplete sequence> in various contexts
+ struct incomplete_seq_intern {
+ int val;
+ char is[4];
+ int val2;
+ };
+ struct incomplete_seq_end {
+ int val;
+ char is[4];
+ };
+ unsigned char a[4] = {',', 020, 021, 0325};
+ incomplete_seq_intern b = { 1, {',', 020, 021, 0325}, 2 };
+ incomplete_seq_end c = { 1, {',', 020, 021, 0325} };
+ unsigned char d[30][4] = { {',', 020, 021, 0325}, };
+ for (int i = 1; i < 30; i++)
+ memcpy(d[i], d[0], 4);
+ incomplete_seq_intern ba[30] = { { 1, {',', 020, 021, 0325}, 2 } };
+ incomplete_seq_end ca[30] = { { 1, {',', 020, 021, 0325} } };
+
f(t);
}