summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2015-11-27 13:26:14 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-12-21 16:14:50 +0100
commit86ec311896dd5d481eba7f361ab8dd2f0b043578 (patch)
tree09fd563dc5e1821b3855ae8f07c09c6716ace0e9 /src
parentcdd05f0ed439787d79ff7a0e04c3fc6e2516a64c (diff)
msgb: Let msgb_hexdump be more tolerant
This patch makes msgb_hexdump accept out of range lXh pointers and shows info about them instead of aborting the dump entirely. Sponsored-by: On-Waves ehf
Diffstat (limited to 'src')
-rw-r--r--src/msgb.c46
1 files changed, 39 insertions, 7 deletions
diff --git a/src/msgb.c b/src/msgb.c
index 3132644d..4b108a49 100644
--- a/src/msgb.c
+++ b/src/msgb.c
@@ -266,10 +266,25 @@ const char *msgb_hexdump(const struct msgb *msg)
if (!lxhs[i])
continue;
- if (lxhs[i] < msg->data)
- goto out_of_range;
+ if (lxhs[i] < msg->head)
+ continue;
+ if (lxhs[i] > msg->head + msg->data_len)
+ continue;
if (lxhs[i] > msg->tail)
- goto out_of_range;
+ continue;
+ if (lxhs[i] < msg->data || lxhs[i] > msg->tail) {
+ nchars = snprintf(buf + buf_offs, sizeof(buf) - buf_offs,
+ "(L%d=data%+d) ",
+ i+1, lxhs[i] - msg->data);
+ buf_offs += nchars;
+ continue;
+ }
+ if (lxhs[i] < start) {
+ nchars = snprintf(buf + buf_offs, sizeof(buf) - buf_offs,
+ "(L%d%+d) ", i+1, start - lxhs[i]);
+ buf_offs += nchars;
+ continue;
+ }
nchars = snprintf(buf + buf_offs, sizeof(buf) - buf_offs,
"%s[L%d]> ",
osmo_hexdump(start, lxhs[i] - start),
@@ -285,11 +300,28 @@ const char *msgb_hexdump(const struct msgb *msg)
if (nchars < 0 || nchars + buf_offs >= sizeof(buf))
return "ERROR";
- return buf;
+ buf_offs += nchars;
+
+ for (i = 0; i < ARRAY_SIZE(lxhs); i++) {
+ if (!lxhs[i])
+ continue;
+
+ if (lxhs[i] < msg->head || lxhs[i] > msg->head + msg->data_len) {
+ nchars = snprintf(buf + buf_offs, sizeof(buf) - buf_offs,
+ "(L%d out of range) ", i+1);
+ } else if (lxhs[i] <= msg->data + msg->data_len &&
+ lxhs[i] > msg->tail) {
+ nchars = snprintf(buf + buf_offs, sizeof(buf) - buf_offs,
+ "(L%d=tail%+d) ",
+ i+1, lxhs[i] - msg->tail);
+ } else
+ continue;
+
+ if (nchars < 0 || nchars + buf_offs >= sizeof(buf))
+ return "ERROR";
+ buf_offs += nchars;
+ }
-out_of_range:
- nchars = snprintf(buf, sizeof(buf) - buf_offs,
- "!!! L%d out of range", i+1);
return buf;
}