You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Allan Edwards <ak...@us.ibm.com> on 2004/10/07 22:52:28 UTC

[PATCH] WIN64: httpd API changes

This set of changes gets rid of most of the libhttpd
64bit warnings on Windows at the cost of several httpd
API changes. I defined AP_INT_TRUNC_CAST for use where
there are size mismatches with APR API's (those APR
API's will need to be updated in APR 2.0)

Comments before I commit?

Allan
-----
Index: include/ap_mmn.h
===================================================================
RCS file: /home/cvs/httpd-2.0/include/ap_mmn.h,v
retrieving revision 1.69
diff -U3 -r1.69 ap_mmn.h
--- include/ap_mmn.h	4 Jun 2004 22:40:46 -0000	1.69
+++ include/ap_mmn.h	7 Oct 2004 20:48:55 -0000
@@ -84,14 +84,15 @@
   *                      changed ap_add_module, ap_add_loaded_module,
   *                      ap_setup_prelinked_modules, ap_process_resource_config
   * 20040425.1 (2.1.0-dev) Added ap_module_symbol_t and ap_prelinked_module_symbols
+ * 20041007 (2.1.0-dev) API changes to clean up 64bit compiles
   */

  #define MODULE_MAGIC_COOKIE 0x41503230UL /* "AP20" */

  #ifndef MODULE_MAGIC_NUMBER_MAJOR
-#define MODULE_MAGIC_NUMBER_MAJOR 20040425
+#define MODULE_MAGIC_NUMBER_MAJOR 20041007
  #endif
-#define MODULE_MAGIC_NUMBER_MINOR 1                     /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 0                     /* 0...n */

  /**
   * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
Index: include/http_protocol.h
===================================================================
RCS file: /home/cvs/httpd-2.0/include/http_protocol.h,v
retrieving revision 1.92
diff -U3 -r1.92 http_protocol.h
--- include/http_protocol.h	18 Jul 2004 20:06:38 -0000	1.92
+++ include/http_protocol.h	7 Oct 2004 20:48:55 -0000
@@ -340,7 +340,7 @@
   * @return The number of bytes sent
   * @deffunc int ap_rputs(const char *str, request_rec *r)
   */
-AP_DECLARE(int) ap_rputs(const char *str, request_rec *r);
+AP_DECLARE(apr_size_t) ap_rputs(const char *str, request_rec *r);

  /**
   * Write a buffer for the current request
@@ -359,7 +359,7 @@
   * @return The number of bytes sent
   * @deffunc int ap_rvputs(request_rec *r, ...)
   */
-AP_DECLARE_NONSTD(int) ap_rvputs(request_rec *r,...);
+AP_DECLARE_NONSTD(apr_size_t) ap_rvputs(request_rec *r,...);

  /**
   * Output data to the client in a printf format
@@ -369,7 +369,7 @@
   * @return The number of bytes sent
   * @deffunc int ap_vrprintf(request_rec *r, const char *fmt, va_list vlist)
   */
-AP_DECLARE(int) ap_vrprintf(request_rec *r, const char *fmt, va_list vlist);
+AP_DECLARE(apr_size_t) ap_vrprintf(request_rec *r, const char *fmt, va_list vlist);

  /**
   * Output data to the client in a printf format
@@ -379,7 +379,7 @@
   * @return The number of bytes sent
   * @deffunc int ap_rprintf(request_rec *r, const char *fmt, ...)
   */
-AP_DECLARE_NONSTD(int) ap_rprintf(request_rec *r, const char *fmt,...)
+AP_DECLARE_NONSTD(apr_size_t) ap_rprintf(request_rec *r, const char *fmt,...)
  				__attribute__((format(printf,2,3)));
  /**
   * Flush all of the data for the current request to the client
@@ -445,7 +445,7 @@
   *         if EOF, or -1 if there was an error
   * @deffunc long ap_get_client_block(request_rec *r, char *buffer, apr_size_t bufsiz)
   */
-AP_DECLARE(long) ap_get_client_block(request_rec *r, char *buffer, apr_size_t bufsiz);
+AP_DECLARE(apr_size_t) ap_get_client_block(request_rec *r, char *buffer, apr_size_t bufsiz);

  /**
   * In HTTP/1.1, any method can have a body.  However, most GET handlers
Index: include/httpd.h
===================================================================
RCS file: /home/cvs/httpd-2.0/include/httpd.h,v
retrieving revision 1.212
diff -U3 -r1.212 httpd.h
--- include/httpd.h	12 Aug 2004 05:22:59 -0000	1.212
+++ include/httpd.h	7 Oct 2004 20:48:55 -0000
@@ -1091,7 +1091,7 @@
      /** Pathname for ServerPath */
      const char *path;
      /** Length of path */
-    int pathlen;
+    apr_size_t pathlen;

      /** Normal names for ServerAlias servers */
      apr_array_header_t *names;
@@ -1244,7 +1244,7 @@
   * address of field is shifted to the next non-comma, non-whitespace
   * character.  len is the length of the item excluding any beginning whitespace.
   */
-AP_DECLARE(const char *) ap_size_list_item(const char **field, int *len);
+AP_DECLARE(const char *) ap_size_list_item(const char **field, apr_size_t *len);

  /**
   * Retrieve an HTTP header field list item, as separated by a comma,
@@ -1587,7 +1587,7 @@
   * @param c The character to search for
   * @return The index of the first occurrence of c in str
   */
-AP_DECLARE(int) ap_ind(const char *str, char c);	/* Sigh... */
+AP_DECLARE(apr_size_t) ap_ind(const char *str, char c);	/* Sigh... */

  /**
   * Search a string from right to left for the first occurrence of a
@@ -1596,7 +1596,7 @@
   * @param c The character to search for
   * @return The index of the first occurrence of c in str
   */
-AP_DECLARE(int) ap_rind(const char *str, char c);
+AP_DECLARE(apr_size_t) ap_rind(const char *str, char c);

  /**
   * Given a string, replace any bare " with \" .
@@ -1746,6 +1746,10 @@
  #endif

  #define AP_NORESTART		APR_OS_START_USEERR + 1
+
+/* temporary casts for 64bit compiles where there are 32bit int type mismatches in APR APIs */
+#define AP_INT_TRUNC_CAST      int
+#define AP_INT32_TRUNC_CAST    apr_int32_t

  #ifdef __cplusplus
  }
Index: include/scoreboard.h
===================================================================
RCS file: /home/cvs/httpd-2.0/include/scoreboard.h,v
retrieving revision 1.54
diff -U3 -r1.54 scoreboard.h
--- include/scoreboard.h	15 Sep 2004 12:08:39 -0000	1.54
+++ include/scoreboard.h	7 Oct 2004 20:48:55 -0000
@@ -164,7 +164,7 @@
  int ap_create_scoreboard(apr_pool_t *p, ap_scoreboard_e t);
  apr_status_t ap_reopen_scoreboard(apr_pool_t *p, apr_shm_t **shm, int detached);
  void ap_init_scoreboard(void *shared_score);
-AP_DECLARE(int) ap_calc_scoreboard_size(void);
+AP_DECLARE(apr_size_t) ap_calc_scoreboard_size(void);
  apr_status_t ap_cleanup_scoreboard(void *d);

  AP_DECLARE(void) ap_create_sb_handle(ap_sb_handle_t **new_sbh, apr_pool_t *p,
Index: include/util_script.h
===================================================================
RCS file: /home/cvs/httpd-2.0/include/util_script.h,v
retrieving revision 1.23
diff -U3 -r1.23 util_script.h
--- include/util_script.h	9 Feb 2004 20:38:21 -0000	1.23
+++ include/util_script.h	7 Oct 2004 20:48:55 -0000
@@ -53,7 +53,7 @@
   * @return The length of the path info
   * @deffunc int ap_find_path_info(const char *uri, const char *path_info)
   */
-AP_DECLARE(int) ap_find_path_info(const char *uri, const char *path_info);
+AP_DECLARE(apr_size_t) ap_find_path_info(const char *uri, const char *path_info);

  /**
   * Add CGI environment variables required by HTTP/1.1 to the request's
@@ -131,7 +131,7 @@
   * @deffunc int ap_scan_script_header_err_core(request_rec *r, char *buffer, int (*getsfunc)(char *, int, void *), void *getsfunc_data)
   */
  AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer,
-				       int (*getsfunc) (char *, int, void *),
+				       int (*getsfunc) (char *, apr_size_t, void *),
  				       void *getsfunc_data);

  #ifdef __cplusplus
Index: modules/http/http_protocol.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/http/http_protocol.c,v
retrieving revision 1.484
diff -U3 -r1.484 http_protocol.c
--- modules/http/http_protocol.c	29 Sep 2004 14:38:42 -0000	1.484
+++ modules/http/http_protocol.c	7 Oct 2004 20:48:55 -0000
@@ -662,7 +662,7 @@
   */
  AP_DECLARE(int) ap_method_number_of(const char *method)
  {
-    int len = strlen(method);
+    apr_size_t len = strlen(method);
      int which = lookup_builtin_method(method, len);

      if (which != UNKNOWN_METHOD)
@@ -1858,7 +1858,7 @@
   * Returns 0 on End-of-body, -1 on error or premature chunk end.
   *
   */
-AP_DECLARE(long) ap_get_client_block(request_rec *r, char *buffer,
+AP_DECLARE(apr_size_t) ap_get_client_block(request_rec *r, char *buffer,
                                       apr_size_t bufsiz)
  {
      apr_status_t rv;
Index: server/core.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/core.c,v
retrieving revision 1.287
diff -U3 -r1.287 core.c
--- server/core.c	22 Sep 2004 18:21:29 -0000	1.287
+++ server/core.c	7 Oct 2004 20:48:55 -0000
@@ -2298,7 +2298,7 @@
      }

      cmd->server->path = arg;
-    cmd->server->pathlen = (int)strlen(arg);
+    cmd->server->pathlen = strlen(arg);
      return NULL;
  }

@@ -3009,19 +3009,19 @@
  }

  static apr_status_t writev_it_all(apr_socket_t *s,
-                                  struct iovec *vec, int nvec,
+                                  struct iovec *vec, apr_size_t nvec,
                                    apr_size_t len, apr_size_t *nbytes)
  {
      apr_size_t bytes_written = 0;
      apr_status_t rv;
      apr_size_t n = len;
-    int i = 0;
+    apr_size_t i = 0;

      *nbytes = 0;

      /* XXX handle checking for non-blocking socket */
      while (bytes_written != len) {
-        rv = apr_socket_sendv(s, vec + i, nvec - i, &n);
+        rv = apr_socket_sendv(s, vec + i, (AP_INT32_TRUNC_CAST)(nvec - i), &n);
          *nbytes += n;
          bytes_written += n;
          if (rv != APR_SUCCESS)
@@ -4288,12 +4288,12 @@

              memset(&hdtr, '\0', sizeof(hdtr));
              if (nvec) {
-                hdtr.numheaders = nvec;
+                hdtr.numheaders = (AP_INT_TRUNC_CAST)nvec;
                  hdtr.headers = vec;
              }

              if (nvec_trailers) {
-                hdtr.numtrailers = nvec_trailers;
+                hdtr.numtrailers = (AP_INT_TRUNC_CAST)nvec_trailers;
                  hdtr.trailers = vec_trailers;
              }

Index: server/protocol.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/protocol.c,v
retrieving revision 1.153
diff -U3 -r1.153 protocol.c
--- server/protocol.c	21 Sep 2004 21:07:23 -0000	1.153
+++ server/protocol.c	7 Oct 2004 20:48:55 -0000
@@ -1387,7 +1387,7 @@
      return c;
  }

-AP_DECLARE(int) ap_rputs(const char *str, request_rec *r)
+AP_DECLARE(apr_size_t) ap_rputs(const char *str, request_rec *r)
  {
      apr_size_t len;

@@ -1441,7 +1441,7 @@
      return APR_SUCCESS;
  }

-AP_DECLARE(int) ap_vrprintf(request_rec *r, const char *fmt, va_list va)
+AP_DECLARE(apr_size_t) ap_vrprintf(request_rec *r, const char *fmt, va_list va)
  {
      apr_size_t written;
      struct ap_vrprintf_data vd;
@@ -1461,7 +1461,7 @@
      *(vd.vbuff.curpos) = '\0';

      if (written != -1) {
-        int n = vd.vbuff.curpos - vrprintf_buf;
+        apr_size_t n = vd.vbuff.curpos - vrprintf_buf;

          /* last call to buffer_output, to finish clearing the buffer */
          if (buffer_output(r, vrprintf_buf,n) != APR_SUCCESS)
@@ -1473,10 +1473,10 @@
      return written;
  }

-AP_DECLARE_NONSTD(int) ap_rprintf(request_rec *r, const char *fmt, ...)
+AP_DECLARE_NONSTD(apr_size_t) ap_rprintf(request_rec *r, const char *fmt, ...)
  {
      va_list va;
-    int n;
+    apr_size_t n;

      if (r->connection->aborted)
          return -1;
@@ -1488,7 +1488,7 @@
      return n;
  }

-AP_DECLARE_NONSTD(int) ap_rvputs(request_rec *r, ...)
+AP_DECLARE_NONSTD(apr_size_t) ap_rvputs(request_rec *r, ...)
  {
      va_list va;
      const char *s;
Index: server/request.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/request.c,v
retrieving revision 1.137
diff -U3 -r1.137 request.c
--- server/request.c	20 Aug 2004 20:58:49 -0000	1.137
+++ server/request.c	7 Oct 2004 20:48:56 -0000
@@ -1213,7 +1213,8 @@
          /* We start now_merged from NULL since we want to build
           * a locations list that can be merged to any vhost.
           */
-        int len, sec_idx;
+        apr_size_t len;
+        int sec_idx;
          int matches = cache->walked->nelts;
          walk_walked_t *last_walk = (walk_walked_t*)cache->walked->elts;
          cache->cached = entry_uri;
Index: server/scoreboard.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/scoreboard.c,v
retrieving revision 1.77
diff -U3 -r1.77 scoreboard.c
--- server/scoreboard.c	22 Sep 2004 13:35:31 -0000	1.77
+++ server/scoreboard.c	7 Oct 2004 20:48:56 -0000
@@ -88,7 +88,7 @@
      return APR_SUCCESS;
  }

-AP_DECLARE(int) ap_calc_scoreboard_size(void)
+AP_DECLARE(apr_size_t) ap_calc_scoreboard_size(void)
  {
      ap_mpm_query(AP_MPMQ_HARD_LIMIT_THREADS, &thread_limit);
      ap_mpm_query(AP_MPMQ_HARD_LIMIT_DAEMONS, &server_limit);
Index: server/util.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/util.c,v
retrieving revision 1.150
diff -U3 -r1.150 util.c
--- server/util.c	15 Sep 2004 11:44:05 -0000	1.150
+++ server/util.c	7 Oct 2004 20:48:56 -0000
@@ -451,7 +451,7 @@
  AP_DECLARE(void) ap_getparents(char *name)
  {
      char *next;
-    int l, w, first_dot;
+    apr_size_t l, w, first_dot;

      /* Four paseses, as per RFC 1808 */
      /* a) remove ./ path segments */
@@ -480,7 +480,7 @@
      while (name[l] != '\0') {
          if (name[l] == '.' && name[l + 1] == '.' && IS_SLASH(name[l + 2])
              && (l == 0 || IS_SLASH(name[l - 1]))) {
-            register int m = l + 3, n;
+            register apr_size_t m = l + 3, n;

              l = l - 2;
              if (l >= 0) {
@@ -592,7 +592,7 @@
  {
      const char *last_slash = ap_strrchr_c(s, '/');
      char *d;
-    int l;
+    apr_size_t l;

      if (last_slash == NULL) {
          return apr_pstrdup(p, "");
@@ -623,7 +623,7 @@
  AP_DECLARE(char *) ap_getword(apr_pool_t *atrans, const char **line, char stop)
  {
      const char *pos = *line;
-    int len;
+    apr_size_t len;
      char *res;

      while ((*pos != stop) && *pos) {
@@ -653,7 +653,7 @@
  AP_DECLARE(char *) ap_getword_white(apr_pool_t *atrans, const char **line)
  {
      const char *pos = *line;
-    int len;
+    apr_size_t len;
      char *res;

      while (!apr_isspace(*pos) && *pos) {
@@ -705,12 +705,12 @@
   * all honored
   */

-static char *substring_conf(apr_pool_t *p, const char *start, int len,
+static char *substring_conf(apr_pool_t *p, const char *start, apr_size_t len,
                              char quote)
  {
      char *result = apr_palloc(p, len + 2);
      char *resp = result;
-    int i;
+    apr_size_t i;

      for (i = 0; i < len; ++i) {
          if (start[i] == '\\' && (start[i + 1] == '\\'
@@ -887,11 +887,11 @@
      return (int)EOF;
  }

-static void *cfg_getstr(void *buf, size_t bufsiz, void *param)
+static void *cfg_getstr(void *buf, apr_size_t bufsiz, void *param)
  {
      apr_file_t *cfp = (apr_file_t *) param;
      apr_status_t rv;
-    rv = apr_file_gets(buf, bufsiz, cfp);
+    rv = apr_file_gets(buf, (AP_INT_TRUNC_CAST)bufsiz, cfp);
      if (rv == APR_SUCCESS) {
          return buf;
      }
@@ -1152,7 +1152,7 @@
   * of field is shifted to the next non-comma, non-whitespace character.
   * len is the length of the item excluding any beginning whitespace.
   */
-AP_DECLARE(const char *) ap_size_list_item(const char **field, int *len)
+AP_DECLARE(const char *) ap_size_list_item(const char **field, apr_size_t *len)
  {
      const unsigned char *ptr = (const unsigned char *)*field;
      const unsigned char *token;
@@ -1218,7 +1218,8 @@
      const unsigned char *ptr;
      unsigned char *pos;
      char *token;
-    int addspace = 0, in_qpair = 0, in_qstr = 0, in_com = 0, tok_len = 0;
+    int addspace = 0, in_qpair = 0, in_qstr = 0, in_com = 0;
+    apr_size_t tok_len = 0;

      /* Find the beginning and maximum length of the list item so that
       * we can allocate a buffer for the new string and reset the field.
@@ -1411,7 +1412,7 @@
      const char *ptr = *accept_line;
      const char *tok_start;
      char *token;
-    int tok_len;
+    apr_size_t tok_len;

      /* Find first non-white byte */

@@ -1484,7 +1485,7 @@
  AP_DECLARE(int) ap_find_last_token(apr_pool_t *p, const char *line,
                                     const char *tok)
  {
-    int llen, tlen, lidx;
+    apr_size_t llen, tlen, lidx;

      if (!line)
          return 0;
@@ -1969,7 +1970,7 @@
      return (x ? 1 : 0);                /* If the first character is ':', it's broken, too */
  }

-AP_DECLARE(int) ap_ind(const char *s, char c)
+AP_DECLARE(apr_size_t) ap_ind(const char *s, char c)
  {
      const char *p = ap_strchr_c(s, c);

@@ -1978,7 +1979,7 @@
      return p - s;
  }

-AP_DECLARE(int) ap_rind(const char *s, char c)
+AP_DECLARE(apr_size_t) ap_rind(const char *s, char c)
  {
      const char *p = ap_strrchr_c(s, c);

@@ -2079,10 +2080,10 @@
  AP_DECLARE(char *) ap_pbase64encode(apr_pool_t *p, char *string)
  {
      char *encoded;
-    int l = strlen(string);
+    apr_size_t l = strlen(string);

-    encoded = (char *) apr_palloc(p, 1 + apr_base64_encode_len(l));
-    l = apr_base64_encode(encoded, string, l);
+    encoded = (char *) apr_palloc(p, 1 + apr_base64_encode_len((AP_INT_TRUNC_CAST)l));
+    l = apr_base64_encode(encoded, string, (AP_INT_TRUNC_CAST)l);
      encoded[l] = '\0'; /* make binary sequence into string */

      return encoded;
Index: server/util_script.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/util_script.c,v
retrieving revision 1.91
diff -U3 -r1.91 util_script.c
--- server/util_script.c	1 Aug 2004 01:12:30 -0000	1.91
+++ server/util_script.c	7 Oct 2004 20:48:56 -0000
@@ -283,10 +283,10 @@
   * and find as much of the two that match as possible.
   */

-AP_DECLARE(int) ap_find_path_info(const char *uri, const char *path_info)
+AP_DECLARE(apr_size_t) ap_find_path_info(const char *uri, const char *path_info)
  {
-    int lu = strlen(uri);
-    int lp = strlen(path_info);
+    apr_size_t lu = strlen(uri);
+    apr_size_t lp = strlen(path_info);

      while (lu-- && lp-- && uri[lu] == path_info[lp]);

@@ -354,7 +354,7 @@
          apr_table_setn(e, "SCRIPT_NAME", r->uri);
      }
      else {
-        int path_info_start = ap_find_path_info(r->uri, r->path_info);
+        apr_size_t path_info_start = ap_find_path_info(r->uri, r->path_info);

          apr_table_setn(e, "SCRIPT_NAME",
                        apr_pstrndup(r->pool, r->uri, path_info_start));
@@ -394,12 +394,12 @@
  }

  AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer,
-                                       int (*getsfunc) (char *, int, void *),
+                                       int (*getsfunc) (char *, apr_size_t, void *),
                                         void *getsfunc_data)
  {
      char x[MAX_STRING_LEN];
      char *w, *l;
-    int p;
+    apr_size_t p;
      int cgi_status = HTTP_OK;
      apr_table_t *merge;
      apr_table_t *cookie_table;
@@ -581,9 +581,9 @@
      return OK;
  }

-static int getsfunc_FILE(char *buf, int len, void *f)
+static int getsfunc_FILE(char *buf, apr_size_t len, void *f)
  {
-    return apr_file_gets(buf, len, (apr_file_t *) f) == APR_SUCCESS;
+    return apr_file_gets(buf, (AP_INT_TRUNC_CAST)len, (apr_file_t *) f) == APR_SUCCESS;
  }

  AP_DECLARE(int) ap_scan_script_header_err(request_rec *r, apr_file_t *f,
@@ -592,7 +592,7 @@
      return ap_scan_script_header_err_core(r, buffer, getsfunc_FILE, f);
  }

-static int getsfunc_BRIGADE(char *buf, int len, void *arg)
+static int getsfunc_BRIGADE(char *buf, apr_size_t len, void *arg)
  {
      apr_bucket_brigade *bb = (apr_bucket_brigade *)arg;
      const char *dst_end = buf + len - 1; /* leave room for terminating null */
@@ -650,11 +650,11 @@
      const char *curpos;
  };

-static int getsfunc_STRING(char *w, int len, void *pvastrs)
+static int getsfunc_STRING(char *w, apr_size_t len, void *pvastrs)
  {
      struct vastrs *strs = (struct vastrs*) pvastrs;
      const char *p;
-    int t;
+    apr_size_t t;

      if (!strs->curpos || !*strs->curpos)
          return 0;
@@ -674,7 +674,7 @@
      }
      else
          strs->curpos += t;
-    return t;
+    return t > 0 ? 1 : 0;
  }

  /* ap_scan_script_header_err_strs() accepts additional const char* args...



Re: [PATCH] WIN64: httpd API changes

Posted by Allan Edwards <ak...@us.ibm.com>.
Joe Orton wrote:
> The ap_r* changes are not safe: these functions return negative values
> on error.  Each and every int->size_t conversion needs to be carefully
> checked for this kind of issue.

Good point. I will review closely this weekend.

Thanks, Allan

Re: [PATCH] WIN64: httpd API changes

Posted by Joe Orton <jo...@redhat.com>.
On Thu, Oct 07, 2004 at 04:52:28PM -0400, Allan Edwards wrote:
> This set of changes gets rid of most of the libhttpd
> 64bit warnings on Windows at the cost of several httpd
> API changes. I defined AP_INT_TRUNC_CAST for use where
> there are size mismatches with APR API's (those APR
> API's will need to be updated in APR 2.0)

Again I think the use of the macro is really ugly.

> -AP_DECLARE(int) ap_rputs(const char *str, request_rec *r);
> +AP_DECLARE(apr_size_t) ap_rputs(const char *str, request_rec *r);

The ap_r* changes are not safe: these functions return negative values
on error.  Each and every int->size_t conversion needs to be carefully
checked for this kind of issue.

joe