diff mbox

[2/8] msgb: Let msgb_hexdump be more tolerant

Message ID 1448627180-10603-3-git-send-email-jerlbeck@sysmocom.de
State Accepted
Headers show

Commit Message

Jacob Erlbeck Nov. 27, 2015, 12:26 p.m. UTC
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
---
 src/msgb.c | 46 +++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 39 insertions(+), 7 deletions(-)
diff mbox

Patch

diff --git a/src/msgb.c b/src/msgb.c
index 3132644..4b108a4 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;
 }