diff mbox

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

Message ID 1447753069-17466-2-git-send-email-jerlbeck@sysmocom.de
State Superseded
Headers show

Commit Message

Jacob Erlbeck Nov. 17, 2015, 9:37 a.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 a257479..d896b53 100644
--- a/src/msgb.c
+++ b/src/msgb.c
@@ -263,10 +263,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),
@@ -282,11 +297,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;
 }