apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jim Jagielski <...@jaguNET.com>
Subject apr_snprintf.c patch - len == 0
Date Sun, 25 Aug 2002 18:24:03 GMT
Hmm. The patch doesn't seem to do the right thing if buff is non-NULL
and len == 0 (we simple want to return the length that would be written
but *never* actually touch buff if len == 0).

The below patch should address that, but:

   1. This is rushed, so I'm not sure if my assumption about
      apr_snprintf() not working right is valid
   2. If the below will fix it.

I wanted to get this out quick though...

Index: strings/apr_snprintf.c
===================================================================
RCS file: /home/cvs/apr/strings/apr_snprintf.c,v
retrieving revision 1.27
diff -u -r1.27 apr_snprintf.c
--- strings/apr_snprintf.c	25 Aug 2002 04:22:35 -0000	1.27
+++ strings/apr_snprintf.c	25 Aug 2002 18:19:18 -0000
@@ -1249,9 +1249,18 @@
     va_list ap;
     apr_vformatter_buff_t vbuff;
 
-    /* save one byte for nul terminator */
-    vbuff.curpos = buf;
-    vbuff.endpos = buf + len - 1;
+    if (len == 0) {
+        /* In this special case, we don't care if buff is NULL or not
+         * we just want to return the number of chars that would be written.
+         * So we leverage the fact that INS_CHAR just does the inserts
+         * iff the pointer is non-NULL */
+        vbuff.curpos = NULL;
+        vbuff.endpos = NULL;
+    } else {
+	/* save one byte for nul terminator */
+	vbuff.curpos = buf;
+        vbuff.endpos = buf + len - 1;
+    }
     va_start(ap, format);
     cc = apr_vformatter(snprintf_flush, &vbuff, format, ap);
     va_end(ap);
@@ -1268,9 +1277,18 @@
     int cc;
     apr_vformatter_buff_t vbuff;
 
-    /* save one byte for nul terminator */
-    vbuff.curpos = buf;
-    vbuff.endpos = buf + len - 1;
+    if (len == 0) {
+        /* In this special case, we don't care if buff is NULL or not
+         * we just want to return the number of chars that would be written.
+         * So we leverage the fact that INS_CHAR just does the inserts
+         * iff the pointer is non-NULL */
+        vbuff.curpos = NULL;
+        vbuff.endpos = NULL;
+    } else {
+	/* save one byte for nul terminator */
+	vbuff.curpos = buf;
+        vbuff.endpos = buf + len - 1;
+    }
     cc = apr_vformatter(snprintf_flush, &vbuff, format, ap);
     if (len != 0) {
         *vbuff.curpos = '\0';
-- 
===========================================================================
   Jim Jagielski   [|]   jim@jaguNET.com   [|]   http://www.jaguNET.com/
      "A society that will trade a little liberty for a little order
             will lose both and deserve neither" - T.Jefferson

Mime
View raw message