diff --git a/include/common/standard.h b/include/common/standard.h index 3d9083c1d..5cd056473 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -1482,6 +1482,7 @@ int dump_text(struct buffer *out, const char *buf, int bsize); int dump_binary(struct buffer *out, const char *buf, int bsize); int dump_text_line(struct buffer *out, const char *buf, int bsize, int len, int *line, int ptr); +void dump_addr_and_bytes(struct buffer *buf, const char *pfx, const void *addr, int n); void dump_hex(struct buffer *out, const char *pfx, const void *buf, int len, int unsafe); int may_access(const void *ptr); diff --git a/src/standard.c b/src/standard.c index 02c1af6b7..bd148ee68 100644 --- a/src/standard.c +++ b/src/standard.c @@ -4191,6 +4191,31 @@ void dump_hex(struct buffer *out, const char *pfx, const void *buf, int len, int } } +/* dumps followed by bytes from in hex form into buffer + * enclosed in brackets after the address itself, formatted on 14 chars + * including the "0x" prefix. This is meant to be used as a prefix for code + * areas. For example: + * "0x7f10b6557690 [48 c7 c0 0f 00 00 00 0f]" + * It relies on may_access() to know if the bytes are dumpable, otherwise "--" + * is emitted. A NULL will be considered empty. + */ +void dump_addr_and_bytes(struct buffer *buf, const char *pfx, const void *addr, int n) +{ + int ok = 0; + int i; + + chunk_appendf(buf, "%s%#14lx [", pfx ? pfx : "", (long)addr); + + for (i = 0; i < n; i++) { + if (i == 0 || (((long)(addr + i) ^ (long)(addr)) & 4096)) + ok = may_access(addr + i); + if (ok) + chunk_appendf(buf, "%02x%s", ((uint8_t*)addr)[i], (i. The format is : * <2 spaces> <70 chars max> <\n> * which is 60 chars per line. Non-printable chars \t, \n, \r and \e are