git: b4fb947923b5 - main - bhyve: Escape binary data sent in reply packets
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 31 Jul 2024 23:44:39 UTC
The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=b4fb947923b566a3a8a6ad8e5f8ea8dec0c68ee4 commit b4fb947923b566a3a8a6ad8e5f8ea8dec0c68ee4 Author: Mark Johnston <markj@FreeBSD.org> AuthorDate: 2024-07-31 22:41:13 +0000 Commit: Mark Johnston <markj@FreeBSD.org> CommitDate: 2024-07-31 22:41:13 +0000 bhyve: Escape binary data sent in reply packets Per https://sourceware.org/gdb/current/onlinedocs/gdb.html/Overview.html#Binary-Data certain bytes must be escaped. The XML register definitions we have so far do not run afoul of that rule, but the stub should handle them anyway. Reviewed by: jhb MFC after: 2 weeks Sponsored by: Innovate UK Differential Revision: https://reviews.freebsd.org/D46194 --- usr.sbin/bhyve/gdb.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/usr.sbin/bhyve/gdb.c b/usr.sbin/bhyve/gdb.c index a13166e1e2c8..7c04b0017c80 100644 --- a/usr.sbin/bhyve/gdb.c +++ b/usr.sbin/bhyve/gdb.c @@ -651,6 +651,28 @@ append_packet_data(const uint8_t *data, size_t len) } } +static void +append_binary_data(const uint8_t *data, size_t len) +{ + uint8_t buf[2]; + + for (; len > 0; data++, len--) { + switch (*data) { + case '}': + case '#': + case '$': + case '*': + buf[0] = 0x7d; + buf[1] = *data ^ 0x20; + append_packet_data(buf, 2); + break; + default: + append_packet_data(data, 1); + break; + } + } +} + static void append_string(const char *str) { @@ -1801,10 +1823,10 @@ gdb_query(const uint8_t *data, size_t len) append_char('l'); } else if (doff + dlen >= xmllen) { append_char('l'); - append_packet_data(xml + doff, xmllen - doff); + append_binary_data(xml + doff, xmllen - doff); } else { append_char('m'); - append_packet_data(xml + doff, dlen); + append_binary_data(xml + doff, dlen); } finish_packet(); (void)munmap(__DECONST(void *, xml), xmllen);