This allows ap_vrprintf to handle > 4k length writes, as listed in STATUS.

regards,

-- 
Cody Sherr

Engineer
Covalent Technologies

phone: (415)536-5292
email: [EMAIL PROTECTED]

Index: protocol.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/protocol.c,v
retrieving revision 1.35
diff -u -r1.35 protocol.c
--- protocol.c  2001/07/30 04:38:02     1.35
+++ protocol.c  2001/08/01 21:08:02
@@ -1135,14 +1135,31 @@

 AP_DECLARE(int) ap_vrprintf(request_rec *r, const char *fmt, va_list va)
 {
-    char buf[4096];
+    char *buf;
+    int   buf_size = 4096; /* start with a 4k buffer */
     apr_size_t written;

     if (r->connection->aborted)
         return -1;

-    /* ### fix this mechanism to allow more than 4K of output */
-    written = apr_vsnprintf(buf, sizeof(buf), fmt, va);
+    buf = apr_palloc(r->pool, buf_size);
+    while (1) {
+       written = apr_vsnprintf(buf, buf_size, fmt, va);
+
+       /*
+        * Per the apr_vsnprintf comments, in no event does apr_snprintf return a 
+negative number.
+        * Therefore, it's not possible to distinguish between an output which was 
+truncated,
+        * and an output which exactly filled the buffer.
+        */
+       if (written == buf_size) {
+           buf_size *= 2;
+           buf = apr_palloc(r->pool, buf_size); /* want realloc */
+       }
+       else {
+           break;
+       }
+    }
+
     if (buffer_output(r, buf, written) != APR_SUCCESS)
         return -1;


Reply via email to