debug: refactor a lot of buffer debug functions using a shared formatter.
This commit is contained in:
@@ -38,6 +38,8 @@
|
||||
|
||||
static void mydebug(char const *format, va_list args);
|
||||
|
||||
static char const *hex2char = "0123456789abcdef";
|
||||
|
||||
/**
|
||||
* Helper macro to write an integer value to a given file descriptor,
|
||||
* either in base 10 or in hexadecimal.
|
||||
@@ -172,8 +174,6 @@ static inline void append(void const *data, size_t count)
|
||||
|
||||
static void mydebug(char const *format, va_list args)
|
||||
{
|
||||
static char const *hex2char = "0123456789abcdef";
|
||||
|
||||
zzuf_mutex_lock(&debug_mutex);
|
||||
|
||||
int saved_errno = errno;
|
||||
@@ -331,3 +331,40 @@ static void mydebug(char const *format, va_list args)
|
||||
errno = saved_errno;
|
||||
}
|
||||
|
||||
void zzuf_debug_str(char *str, uint8_t const *buffer,
|
||||
unsigned len, unsigned maxlen)
|
||||
{
|
||||
/* Open the double quotes */
|
||||
*str++ = '"';
|
||||
|
||||
/* Print as many escaped characters as possible */
|
||||
for (unsigned i = 0; i < len && i < maxlen; ++i)
|
||||
{
|
||||
if (buffer[i] >= 0x20 && buffer[i] < 0x7f
|
||||
&& buffer[i] != '\\' && buffer[i] != '\"')
|
||||
{
|
||||
*str++ = buffer[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
*str++ = '\\';
|
||||
*str++ = buffer[i] == '\0' ? '0'
|
||||
: buffer[i] == '\n' ? 'n'
|
||||
: buffer[i] == '\t' ? 't'
|
||||
: buffer[i] == '\r' ? 'r'
|
||||
: buffer[i] == '\\' ? '\\'
|
||||
: buffer[i] == '\"' ? '\"'
|
||||
: 'x';
|
||||
|
||||
if (str[-1] == 'x')
|
||||
{
|
||||
*str++ = hex2char[(buffer[i] & 0xf0) >> 4];
|
||||
*str++ = hex2char[buffer[i] & 0x0f];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Close the double quotes */
|
||||
strcpy(str, len > maxlen ? "…\"" : "\"");
|
||||
}
|
||||
|
||||
|
||||
@@ -14,14 +14,18 @@
|
||||
* debug.h: debugging support
|
||||
*/
|
||||
|
||||
extern void zzuf_debug(const char *format, ...) ATTRIBUTE_PRINTF(1,2);
|
||||
extern void zzuf_debug2(const char *format, ...) ATTRIBUTE_PRINTF(1,2);
|
||||
extern void zzuf_debug(char const *format, ...) ATTRIBUTE_PRINTF(1,2);
|
||||
extern void zzuf_debug2(char const *format, ...) ATTRIBUTE_PRINTF(1,2);
|
||||
extern void zzuf_debug_str(char *str, uint8_t const *buffer,
|
||||
unsigned len, unsigned maxlen);
|
||||
|
||||
#ifdef LIBZZUF
|
||||
# define debug zzuf_debug
|
||||
# define debug2 zzuf_debug2
|
||||
# define debug_str zzuf_debug_str
|
||||
#else
|
||||
# define debug(...) do {} while (0)
|
||||
# define debug2(...) do {} while (0)
|
||||
# define debug_str(...) do {} while (0)
|
||||
#endif
|
||||
|
||||
|
||||
@@ -383,20 +383,14 @@ int NEW(socket)(int domain, int type, int protocol)
|
||||
\
|
||||
if (ret > 0) \
|
||||
{ \
|
||||
char *b = buf; \
|
||||
_zz_fuzz(s, buf, ret); \
|
||||
_zz_addpos(s, ret); \
|
||||
if (ret >= 4) \
|
||||
debug("%s(%i, %p, %li, 0x%x) = %i \"%c%c%c%c...", __func__, \
|
||||
s, buf, (long int)len, flags, ret, \
|
||||
b[0], b[1], b[2], b[3]); \
|
||||
else \
|
||||
debug("%s(%i, %p, %li, 0x%x) = %i \"%c...", __func__, \
|
||||
s, buf, (long int)len, flags, ret, b[0]); \
|
||||
} \
|
||||
else \
|
||||
debug("%s(%i, %p, %li, 0x%x) = %i", __func__, \
|
||||
s, buf, (long int)len, flags, ret); \
|
||||
\
|
||||
char tmp[128]; \
|
||||
debug_str(tmp, buf, ret, 8); \
|
||||
debug("%s(%i, %p, %li, 0x%x) = %i %s", __func__, \
|
||||
s, buf, (long int)len, flags, ret, tmp); \
|
||||
} while (0);
|
||||
|
||||
#if defined HAVE_RECV
|
||||
@@ -426,26 +420,20 @@ RECV_T NEW(__recv_chk)(int s, void *buf, size_t len, size_t buflen, int flags)
|
||||
\
|
||||
if (ret > 0) \
|
||||
{ \
|
||||
char tmp[128]; \
|
||||
char *b = buf; \
|
||||
_zz_fuzz(s, buf, ret); \
|
||||
_zz_addpos(s, ret); \
|
||||
if (fromlen) \
|
||||
sprintf(tmp, "&%i", (int)*fromlen); \
|
||||
else \
|
||||
strcpy(tmp, "NULL"); \
|
||||
if (ret >= 4) \
|
||||
debug("%s(%i, %p, %li, 0x%x, %p, %s) = %i \"%c%c%c%c...", \
|
||||
__func__, s, buf, (long int)len, flags, from, tmp, \
|
||||
ret, b[0], b[1], b[2], b[3]); \
|
||||
else \
|
||||
debug("%s(%i, %p, %li, 0x%x, %p, %s) = %i \"%c...", \
|
||||
__func__, s, buf, (long int)len, flags, from, tmp, \
|
||||
ret, b[0]); \
|
||||
} \
|
||||
\
|
||||
char tmp[128], tmp2[128]; \
|
||||
if (ret > 0 && fromlen) \
|
||||
sprintf(tmp, "&%i", (int)*fromlen); \
|
||||
else if (ret > 0) \
|
||||
strcpy(tmp, "NULL"); \
|
||||
else \
|
||||
debug("%s(%i, %p, %li, 0x%x, %p, %p) = %i", __func__, \
|
||||
s, buf, (long int)len, flags, from, fromlen, ret); \
|
||||
tmp[0] = '\0'; \
|
||||
debug_str(tmp2, buf, ret, 8); \
|
||||
debug("%s(%i, %p, %li, 0x%x, %p, %s) = %i %s", __func__, \
|
||||
s, buf, (long int)len, flags, from, tmp, ret, tmp2); \
|
||||
} while (0)
|
||||
|
||||
#if defined HAVE_RECVFROM
|
||||
@@ -498,19 +486,15 @@ RECV_T NEW(recvmsg)(int s, struct msghdr *hdr, int flags)
|
||||
\
|
||||
if (ret > 0) \
|
||||
{ \
|
||||
char *b = buf; \
|
||||
_zz_fuzz(fd, buf, ret); \
|
||||
_zz_addpos(fd, ret); \
|
||||
if (ret >= 4) \
|
||||
debug("%s(%i, %p, %li) = %i \"%c%c%c%c...", __func__, fd, \
|
||||
buf, (long int)count, ret, b[0], b[1], b[2], b[3]); \
|
||||
else \
|
||||
debug("%s(%i, %p, %li) = %i \"%c...", __func__, fd, \
|
||||
buf, (long int)count, ret, b[0]); \
|
||||
} \
|
||||
else \
|
||||
debug("%s(%i, %p, %li) = %i", __func__, fd, \
|
||||
buf, (long int)count, ret); \
|
||||
\
|
||||
char tmp[128]; \
|
||||
debug_str(tmp, buf, ret, 8); \
|
||||
debug("%s(%i, %p, %li) = %i %s", __func__, \
|
||||
fd, buf, (long int)count, ret, tmp); \
|
||||
\
|
||||
offset_check(fd); \
|
||||
} while (0)
|
||||
|
||||
@@ -567,23 +551,16 @@ ssize_t NEW(pread)(int fd, void *buf, size_t count, off_t offset)
|
||||
if (ret > 0)
|
||||
{
|
||||
long int curoff = _zz_getpos(fd);
|
||||
char *b = buf;
|
||||
|
||||
_zz_setpos(fd, offset);
|
||||
_zz_fuzz(fd, buf, ret);
|
||||
_zz_setpos(fd, curoff);
|
||||
|
||||
if (ret >= 4)
|
||||
debug("%s(%i, %p, %li, %li) = %i \"%c%c%c%c...", __func__, fd, buf,
|
||||
(long int)count, (long int)offset, ret,
|
||||
b[0], b[1], b[2], b[3]);
|
||||
else
|
||||
debug("%s(%i, %p, %li, %li) = %i \"%c...", __func__, fd, buf,
|
||||
(long int)count, (long int)offset, ret, b[0]);
|
||||
}
|
||||
else
|
||||
debug("%s(%i, %p, %li, %li) = %i", __func__, fd, buf,
|
||||
(long int)count, (long int)offset, ret);
|
||||
|
||||
char tmp[128];
|
||||
debug_str(tmp, buf, ret, 8);
|
||||
debug("%s(%i, %p, %li, %li) = %i %s", __func__,
|
||||
fd, buf, (long int)count, (long int)offset, ret, tmp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -733,7 +710,8 @@ static void offset_check(int fd)
|
||||
off_t ret = ORIG(lseek)(fd, 0, SEEK_CUR);
|
||||
#endif
|
||||
if (ret != -1 && ret != _zz_getpos(fd))
|
||||
debug("warning: offset inconsistency");
|
||||
debug("warning: lseek(%d, 0, SEEK_CUR) = %lli (expected %lli)",
|
||||
fd, (long long int)ret, (long long int)_zz_getpos(fd));
|
||||
errno = orig_errno;
|
||||
}
|
||||
|
||||
|
||||
@@ -314,6 +314,8 @@ int nbmaps = 0;
|
||||
ret = MAP_FAILED; \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
size_t data_length = 0; \
|
||||
if (b != MAP_FAILED) \
|
||||
{ \
|
||||
int i, oldpos; \
|
||||
@@ -331,7 +333,7 @@ int nbmaps = 0;
|
||||
/* If we requested a memory area larger than the end of the
|
||||
* file, it was not actually allocated, so do not try to
|
||||
* copy data beyond that point. */ \
|
||||
size_t data_length = _zz_bytes_until_eof(fd, offset); \
|
||||
data_length = _zz_bytes_until_eof(fd, offset); \
|
||||
if (data_length > length) \
|
||||
data_length = length; \
|
||||
\
|
||||
@@ -345,19 +347,13 @@ int nbmaps = 0;
|
||||
_zz_fuzz(fd, (uint8_t *)b, length); \
|
||||
_zz_setpos(fd, oldpos); \
|
||||
ret = b; \
|
||||
if (data_length >= 4) \
|
||||
debug("%s(%p, %li, %i, %i, %i, %lli) = %p \"%c%c%c%c...", \
|
||||
__func__, start, (long int)length, prot, flags, fd, \
|
||||
(long long int)offset, ret, b[0], b[1], b[2], b[3]); \
|
||||
else \
|
||||
debug("%s(%p, %li, %i, %i, %i, %lli) = %p \"%c...", \
|
||||
__func__, start, (long int)length, prot, flags, fd, \
|
||||
(long long int)offset, ret, b[0]); \
|
||||
} \
|
||||
else \
|
||||
debug("%s(%p, %li, %i, %i, %i, %lli) = %p", \
|
||||
__func__, start, (long int)length, prot, flags, fd, \
|
||||
(long long int)offset, ret); \
|
||||
\
|
||||
char tmp[128]; \
|
||||
debug_str(tmp, (uint8_t *)b, (unsigned)data_length, 8); \
|
||||
debug("%s(%p, %li, %i, %i, %i, %lli) = %p %s", __func__, start, \
|
||||
(long int)length, prot, flags, fd, (long long int)offset, \
|
||||
ret, tmp); \
|
||||
} while (0)
|
||||
|
||||
#if defined HAVE_MMAP
|
||||
@@ -412,7 +408,10 @@ kern_return_t NEW(map_fd)(int fd, vm_offset_t offset, vm_offset_t *addr,
|
||||
if (!must_fuzz_fd(fd))
|
||||
return ret;
|
||||
|
||||
if (ret == 0 && numbytes)
|
||||
if (ret != 0)
|
||||
numbytes = 0;
|
||||
|
||||
if (numbytes)
|
||||
{
|
||||
/* FIXME: do we also have to rewind the filedescriptor like in mmap? */
|
||||
char *b = malloc(numbytes);
|
||||
@@ -422,20 +421,13 @@ kern_return_t NEW(map_fd)(int fd, vm_offset_t offset, vm_offset_t *addr,
|
||||
/* FIXME: the map is never freed; there is no such thing as unmap_fd,
|
||||
* but I suppose that kind of map should go when the filedescriptor is
|
||||
* closed (unlike mmap, which returns a persistent buffer). */
|
||||
|
||||
if (numbytes >= 4)
|
||||
debug("%s(%i, %lli, &%p, %i, %lli) = %i \"%c%c%c%c", __func__,
|
||||
fd, (long long int)offset, (void *)*addr, (int)find_space,
|
||||
(long long int)numbytes, ret, b[0], b[1], b[2], b[3]);
|
||||
else
|
||||
debug("%s(%i, %lli, &%p, %i, %lli) = %i \"%c", __func__, fd,
|
||||
(long long int)offset, (void *)*addr, (int)find_space,
|
||||
(long long int)numbytes, ret, b[0]);
|
||||
}
|
||||
else
|
||||
debug("%s(%i, %lli, &%p, %i, %lli) = %i", __func__, fd,
|
||||
(long long int)offset, (void *)*addr, (int)find_space,
|
||||
(long long int)numbytes, ret);
|
||||
|
||||
char tmp[128];
|
||||
debug_str(tmp, (uint8_t *)*addr, numbytes, 8);
|
||||
debug("%s(%i, %lli, &%p, %i, %lli) = %i %s", __func__, fd,
|
||||
(long long int)offset, (void *)*addr, (int)find_space,
|
||||
(long long int)numbytes, ret, tmp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -561,17 +561,11 @@ void NEW(rewind)(FILE *stream)
|
||||
} \
|
||||
_zz_setpos(fd, newpos); \
|
||||
debug_stream("after", stream); \
|
||||
if (newpos >= oldpos + 4) \
|
||||
debug("%s(%p, %li, %li, [%i]) = %li \"%c%c%c%c...", __func__, \
|
||||
ptr, (long int)size, (long int)nmemb, fd, \
|
||||
(long int)ret, b[0], b[1], b[2], b[3]); \
|
||||
else if (newpos > oldpos) \
|
||||
debug("%s(%p, %li, %li, [%i]) = %li \"%c...", __func__, ptr, \
|
||||
(long int)size, (long int)nmemb, fd, \
|
||||
(long int)ret, b[0]); \
|
||||
else \
|
||||
debug("%s(%p, %li, %li, [%i]) = %li", __func__, ptr, \
|
||||
(long int)size, (long int)nmemb, fd, (long int)ret); \
|
||||
\
|
||||
char tmp[128]; \
|
||||
debug_str(tmp, b, newpos - oldpos, 8); \
|
||||
debug("%s(%p, %li, %li, [%i]) = %li %s", __func__, ptr, \
|
||||
(long int)size, (long int)nmemb, fd, (long int)ret, tmp); \
|
||||
} while (0)
|
||||
|
||||
#undef fread
|
||||
|
||||
Reference in New Issue
Block a user