debug: refactor a lot of buffer debug functions using a shared formatter.

This commit is contained in:
Sam Hocevar
2015-01-19 23:54:58 +01:00
parent 60e1d2f001
commit a5bb4b567e
5 changed files with 97 additions and 92 deletions

View File

@@ -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 ? "\"" : "\"");
}

View File

@@ -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

View File

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

View File

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

View File

@@ -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