From 2e8db779f9d0753bd1f235e1d3d6ae27cecfd7d2 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Thu, 5 Oct 2017 21:54:28 +0100 Subject: [PATCH] Fix debug output for NULL pointers on FreeBSD. The testsuite had failures, mostly in DB opens finding no existing file, where debug output to stderr showed "0xAAAAAAAA" rather than "(nil)". Code it explicitly, at least in %p handling, rather than relying on sprintf() bevahiour. --- src/src/string.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/src/string.c b/src/src/string.c index 2de595afb..3857e1120 100644 --- a/src/src/string.c +++ b/src/src/string.c @@ -1363,10 +1363,20 @@ while (*fp != 0) break; case 'p': - if (p >= last - 24) { yield = FALSE; goto END_FORMAT; } - strncpy(newformat, item_start, fp - item_start); - newformat[fp - item_start] = 0; - p += sprintf(CS p, newformat, va_arg(ap, void *)); + { + void * ptr; + if (p >= last - 24) { yield = FALSE; goto END_FORMAT; } + /* sprintf() saying "(nil)" for a null pointer doesn't work + on FreeBSD; we get "0xAAAAAAAA". Handle it explicitly. */ + if ((ptr = va_arg(ap, void *))) + { + strncpy(newformat, item_start, fp - item_start); + newformat[fp - item_start] = 0; + p += sprintf(CS p, newformat, va_arg(ap, void *)); + } + else + p += sprintf(CS p, "(nil)"); + } break; /* %f format is inherently insecure if the numbers that it may be -- 2.30.2