Fix debug output for NULL pointers on FreeBSD.
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 5 Oct 2017 20:54:28 +0000 (21:54 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 5 Oct 2017 20:54:28 +0000 (21:54 +0100)
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

index 2de595afb664d3602bc40fc3c50ff728ca7118ab..3857e1120c1bf3b9002597a72477e4c1bb5e251c 100644 (file)
@@ -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