diff --git a/src/plugins/debugger/debuggerprotocol.cpp b/src/plugins/debugger/debuggerprotocol.cpp index c5c418a22e2ecdd9c5848e9127e8a0cebce612f3..b837ef80ce49e8fada581cf0b57b68a12aca3f91 100644 --- a/src/plugins/debugger/debuggerprotocol.cpp +++ b/src/plugins/debugger/debuggerprotocol.cpp @@ -38,6 +38,17 @@ namespace Debugger { namespace Internal { +uchar fromhex(uchar c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + if (c >= 'a' && c <= 'z') + return 10 + c - 'a'; + if (c >= 'A' && c <= 'Z') + return 10 + c - 'A'; + return -1; +} + void skipCommas(const char *&from, const char *to) { while (*from == ',' && from != to) @@ -120,6 +131,26 @@ QByteArray GdbMi::parseCString(const char *&from, const char *to) case 'v': *dst++ = '\v'; break; case '"': *dst++ = '"'; break; case '\\': *dst++ = '\\'; break; + case 'x': { + c = *src++; + int chars = 0; + uchar prod = 0; + while (true) { + uchar val = fromhex(c); + if (val == uchar(-1)) + break; + prod = prod * 16 + val; + if (++chars == 3 || src == end) + break; + c = *src++; + } + if (!chars) { + qDebug() << "MI Parse Error, unrecognized hex escape"; + return QByteArray(); + } + *dst++ = prod; + break; + } default: { int chars = 0; diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index c0ba6502b425a1553837e8c2182d5ebfbf4fb4d2..f07a47623374a42b5a808f26051c0316a5844a42 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -1056,8 +1056,8 @@ void tst_Dumpers::dumper_data() QTest::newRow("QByteArray3") << Data("#include \n", - "const char *str1 = \"\356\";\n" - "const char *str2 = \"\xee\";\n" + "const char *str1 = \"\\356\";\n" + "const char *str2 = \"\\xee\";\n" "const char *str3 = \"\\\\ee\";\n" "QByteArray buf1(str1);\n" "QByteArray buf2(str2);\n"