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 --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;
 }

-- 
1.9.1

Reply via email to