]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
fix some problems in the perchild MPM
authorJeff Trawick <trawick@apache.org>
Fri, 25 Oct 2002 02:20:26 +0000 (02:20 +0000)
committerJeff Trawick <trawick@apache.org>
Fri, 25 Oct 2002 02:20:26 +0000 (02:20 +0000)
apr_socket_t ptr filled in by apr_os_sock_put() needs to be NULL on
entry to have a new structure allocated

various iov problems were fixed

Submitted by:  Jonas Eriksson <jonas@webkonsulterna.com>
Reviewed by:   Jeff Trawick

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@97299 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
server/mpm/experimental/perchild/perchild.c

diff --git a/CHANGES b/CHANGES
index 75dec3fac5350f61c4c693de3cc6fd50a1e51f51..4e732e0e80962c992d285f143840bffe3bb079d1 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,8 @@
 Changes with Apache 2.0.44
 
+  *) Fix some problems in the perchild MPM.  
+     [Jonas Eriksson <jonas@webkonsulterna.com>]
+
   *) Change the CacheRoot processing to check for a required
      value at config time. This saves a lot of wasted processing
      if the mod_disk_cache module is loaded but no CacheRoot
index d9f26230ce16f375497de70e0cbd9edd4464f4df..8b45735410adc80a5f507a54c5e9132811b44b42 100644 (file)
@@ -679,9 +679,9 @@ static apr_status_t receive_from_other_child(void **csd, ap_listen_rec *lr,
 {
     struct msghdr msg;
     struct cmsghdr *cmsg;
-    char headers[HUGE_STRING_LEN];
-    char request_body[HUGE_STRING_LEN];
-    struct iovec iov[2];
+    char buffer[HUGE_STRING_LEN * 2], *headers, *body;
+    int headerslen, bodylen;
+    struct iovec iov;
     int ret, dp;
     apr_os_sock_t sd;
     apr_bucket_alloc_t *alloc = apr_bucket_alloc_create(ptrans);
@@ -690,15 +690,13 @@ static apr_status_t receive_from_other_child(void **csd, ap_listen_rec *lr,
 
     apr_os_sock_get(&sd, lr->sd);
 
-    iov[0].iov_base = headers;
-    iov[0].iov_len = HUGE_STRING_LEN;
-    iov[1].iov_base = request_body;
-    iov[1].iov_len = HUGE_STRING_LEN;
+    iov.iov_base = buffer;
+    iov.iov_len = sizeof(buffer);
 
     msg.msg_name = NULL;
     msg.msg_namelen = 0;
-    msg.msg_iov = iov;
-    msg.msg_iovlen = 2;
+    msg.msg_iov = &iov;
+    msg.msg_iovlen = 1;
 
     cmsg = apr_palloc(ptrans, sizeof(*cmsg) + sizeof(sd));
     cmsg->cmsg_len = sizeof(*cmsg) + sizeof(sd);
@@ -709,20 +707,32 @@ static apr_status_t receive_from_other_child(void **csd, ap_listen_rec *lr,
 
     memcpy(&dp, CMSG_DATA(cmsg), sizeof(dp));
 
+    *csd = NULL; /* tell apr_os_sock_put() to allocate new apr_socket_t */
     apr_os_sock_put((apr_socket_t **)csd, &dp, ptrans);
 
     bucket = apr_bucket_eos_create(alloc);
     APR_BRIGADE_INSERT_HEAD(bb, bucket);
     bucket = apr_bucket_socket_create(*csd, alloc);
     APR_BRIGADE_INSERT_HEAD(bb, bucket);
-    bucket = apr_bucket_heap_create(iov[1].iov_base, 
-                                    iov[1].iov_len, NULL, alloc);
+
+    body = strchr(iov.iov_base, 0);
+    if (!body) {
+        return 1;
+    }
+
+    body++;
+    bodylen = strlen(body);
+
+    headers = iov.iov_base;
+    headerslen = body - headers;
+
+    bucket = apr_bucket_heap_create(body, bodylen, NULL, alloc);
     APR_BRIGADE_INSERT_HEAD(bb, bucket);
-    bucket = apr_bucket_heap_create(iov[0].iov_base, 
-                                    iov[0].iov_len, NULL, alloc);
+    bucket = apr_bucket_heap_create(headers, headerslen, NULL, alloc);
     APR_BRIGADE_INSERT_HEAD(bb, bucket);
 
     apr_pool_userdata_set(bb, "PERCHILD_SOCKETS", NULL, ptrans);
+
     return 0;
 }
 
@@ -730,7 +740,7 @@ static apr_status_t receive_from_other_child(void **csd, ap_listen_rec *lr,
 
 static void *worker_thread(apr_thread_t *thd, void *arg)
 {
-    void *csd = NULL;
+    void *csd;
     apr_pool_t *tpool;      /* Pool for this thread           */
     apr_pool_t *ptrans;     /* Pool for per-transaction stuff */
     volatile int thread_just_started = 1;
@@ -1635,8 +1645,7 @@ static int pass_request(request_rec *r)
     apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc);
     apr_bucket_brigade *sockbb;
     char request_body[HUGE_STRING_LEN] = "\0";
-    apr_off_t len = 0;
-    apr_size_t l = 0;
+    apr_size_t l = sizeof(request_body);
     perchild_header h;
     apr_bucket *sockbuck;
     perchild_server_conf *sconf = (perchild_server_conf *)
@@ -1647,7 +1656,7 @@ static int pass_request(request_rec *r)
                  "passing request to another child.  Vhost: %s, child %d %d",
                  apr_table_get(r->headers_in, "Host"), child_num, sconf->output);
     ap_get_brigade(r->connection->input_filters, bb, AP_MODE_EXHAUSTIVE, APR_NONBLOCK_READ,
-                   len);
+                   0);
 
     for (sockbuck = APR_BRIGADE_FIRST(bb); sockbuck != APR_BRIGADE_SENTINEL(bb);
          sockbuck = APR_BUCKET_NEXT(sockbuck)) {
@@ -1678,7 +1687,7 @@ static int pass_request(request_rec *r)
     iov[0].iov_base = h.headers;
     iov[0].iov_len = strlen(h.headers) + 1;
     iov[1].iov_base = request_body;
-    iov[1].iov_len = len + 1;
+    iov[1].iov_len = l + 1;
 
     msg.msg_name = NULL;
     msg.msg_namelen = 0;