ports/138486: [patch] apache22-peruser-mpm: FreeBSD fixes

Jille Timmermans jille at quis.cx
Wed Sep 2 20:30:09 UTC 2009


>Number:         138486
>Category:       ports
>Synopsis:       [patch] apache22-peruser-mpm: FreeBSD fixes
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          maintainer-update
>Submitter-Id:   current-users
>Arrival-Date:   Wed Sep 02 20:30:08 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator:     Jille Timmermans
>Release:        
>Organization:
>Environment:
>Description:
This will fix the segfault on startup
>How-To-Repeat:

>Fix:


Patch attached with submission follows:

diff -Nur www/apache22-peruser-mpm/Makefile www/apache22-peruser-mpm-r57/Makefile
--- www/apache22-peruser-mpm/Makefile	2009-06-02 13:25:22.000000000 +0200
+++ www/apache22-peruser-mpm-r57/Makefile	2009-09-02 22:22:03.000000000 +0200
@@ -18,6 +18,7 @@
 SLAVE_PORT_MPM=		peruser
 EXTRA_PATCHES+=		${.CURDIR}/files/httpd-2.2.3-peruser-0.3.0.patch
 EXTRA_PATCHES+=		${.CURDIR}/files/httpd-2.2.3-peruser-0.3.0-dc3.patch
+EXTRA_PATCHES+=		${.CURDIR}/files/httpd-2.2.3-peruser-0.3.0-dc3-r57.patch
 WITH_MPM=		${SLAVE_PORT_MPM}
 SLAVE_DESIGNED_FOR=	2.2.11	# 2.2.3 to be honest, but works fine on 2.2.11
 
diff -Nur www/apache22-peruser-mpm/files/httpd-2.2.3-peruser-0.3.0-dc3-r57.patch www/apache22-peruser-mpm-r57/files/httpd-2.2.3-peruser-0.3.0-dc3-r57.patch
--- www/apache22-peruser-mpm/files/httpd-2.2.3-peruser-0.3.0-dc3-r57.patch	1970-01-01 01:00:00.000000000 +0100
+++ www/apache22-peruser-mpm-r57/files/httpd-2.2.3-peruser-0.3.0-dc3-r57.patch	2009-09-02 22:22:03.000000000 +0200
@@ -0,0 +1,275 @@
+--- server/mpm/experimental/peruser/peruser.c	(revision 55)
++++ server/mpm/experimental/peruser/peruser.c	(revision 57)
+@@ -320,7 +320,7 @@
+  * process.
+  */
+ static apr_size_t child_info_size;
+-static child_info *child_info_image;
++static child_info *child_info_image = NULL;
+ static child_grace_info_t *child_grace_info_table;
+ struct ap_ctable *ap_child_table;
+ 
+@@ -936,7 +936,7 @@
+     msg.msg_iovlen  = 5;
+ 
+     cmsg = apr_palloc(pool, sizeof(*cmsg) + sizeof(sock_fd));
+-    cmsg->cmsg_len   = sizeof(*cmsg) + sizeof(sock_fd);
++    cmsg->cmsg_len   = CMSG_LEN(sizeof(sock_fd));
+     cmsg->cmsg_level = SOL_SOCKET;
+     cmsg->cmsg_type  = SCM_RIGHTS;
+ 
+@@ -1034,9 +1034,10 @@
+         ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, "apr_os_sock_get");
+     }
+ 
+-    _DBG("child_num=%d sock=%ld sock_fd=%d\n", my_child_num, sock, sock_fd);
++    _DBG("child_num=%d sock=%ld sock_fd=%d", my_child_num, sock, sock_fd);
+     _DBG("type=%s %d", child_type_string(CHILD_INFO_TABLE[my_child_num].type), my_child_num);
+ 
++#ifdef _OSD_POSIX
+     if (sock_fd >= FD_SETSIZE)
+     {
+         ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL,
+@@ -1048,6 +1049,7 @@
+         _DBG("child_num=%d: exiting with error", my_child_num);
+         return;
+     }
++#endif
+ 
+     if (CHILD_INFO_TABLE[my_child_num].sock_fd < 0)
+     {
+@@ -1300,7 +1302,7 @@
+     msg.msg_iovlen  = 5;
+ 
+     cmsg = apr_palloc(r->pool, sizeof(*cmsg) + sizeof(sock_fd));
+-    cmsg->cmsg_len   = sizeof(*cmsg) + sizeof(sock_fd);
++    cmsg->cmsg_len   = CMSG_LEN(sizeof(sock_fd));
+     cmsg->cmsg_level = SOL_SOCKET;
+     cmsg->cmsg_type  = SCM_RIGHTS;
+ 
+@@ -1309,7 +1311,6 @@
+     msg.msg_control    = cmsg;
+     msg.msg_controllen = cmsg->cmsg_len;
+ 
+-
+     if (processor->status == CHILD_STATUS_STANDBY)
+     {
+         _DBG("Activating child #%d", processor->id);
+@@ -1374,7 +1375,7 @@
+     iov[3].iov_len  = HUGE_STRING_LEN;
+ 
+     cmsg = apr_palloc(ptrans, sizeof(*cmsg) + sizeof(trans_sock_fd));
+-    cmsg->cmsg_len = sizeof(*cmsg) + sizeof(trans_sock_fd);
++    cmsg->cmsg_len = CMSG_LEN(sizeof(trans_sock_fd));
+ 
+     msg.msg_name       = NULL;
+     msg.msg_namelen    = 0;
+@@ -1424,32 +1425,32 @@
+     apr_cpystrn(headers, buff, header_len + 1);
+     _DBG("header_len=%d headers=\"%s\"", header_len, headers);
+ 
+-if (header_len) {    
+-    _DBG("header_len > 0, we got a request", 0);
+-    /* -- store received data into an brigade and add
+-          it to the current transaction's pool -- */
+-    bucket = apr_bucket_eos_create(alloc);
+-    APR_BRIGADE_INSERT_HEAD(bb, bucket);
+-    bucket = apr_bucket_socket_create(*trans_sock, alloc);
+-    APR_BRIGADE_INSERT_HEAD(bb, bucket);
+-
+-    if (body_len) {
+-        body = (char*)&buff[header_len + 1];
+-        _DBG("body_len=%d body=\"%s\"", body_len, body);
+-
+-        bucket = apr_bucket_heap_create(body, body_len, NULL, alloc);
++    if (header_len) {    
++        _DBG("header_len > 0, we got a request", 0);
++        /* -- store received data into an brigade and add
++           it to the current transaction's pool -- */
++        bucket = apr_bucket_eos_create(alloc);
+         APR_BRIGADE_INSERT_HEAD(bb, bucket);
++        bucket = apr_bucket_socket_create(*trans_sock, alloc);
++        APR_BRIGADE_INSERT_HEAD(bb, bucket);
++        
++        if (body_len) {
++            body = (char*)&buff[header_len + 1];
++            _DBG("body_len=%d body=\"%s\"", body_len, body);
++            
++            bucket = apr_bucket_heap_create(body, body_len, NULL, alloc);
++            APR_BRIGADE_INSERT_HEAD(bb, bucket);
++        } else {
++            _DBG("There is no body",0);
++        }
++        
++        bucket = apr_bucket_heap_create(headers, header_len, NULL, alloc);
++        
++        APR_BRIGADE_INSERT_HEAD(bb, bucket);
++        apr_pool_userdata_set(bb, "PERUSER_SOCKETS", NULL, ptrans);
+     } else {
+-        _DBG("There is no body",0);
++        _DBG("header_len == 0, we got a socket only", 0);
+     }
+-
+-    bucket = apr_bucket_heap_create(headers, header_len, NULL, alloc);
+-
+-    APR_BRIGADE_INSERT_HEAD(bb, bucket);
+-    apr_pool_userdata_set(bb, "PERUSER_SOCKETS", NULL, ptrans);
+-} else {
+-    _DBG("header_len == 0, we got a socket only", 0);
+-}
+     _DBG("returning 0", 0);
+     return 0;
+ }
+@@ -2608,6 +2609,12 @@
+     ++ap_my_generation;
+     ap_scoreboard_image->global->running_generation = ap_my_generation;
+     
++    /* cleanup sockets */
++    for (i = 0; i < NUM_SENV; i++) {
++        close(SENV[i].input);
++        close(SENV[i].output);
++    }
++
+     if (is_graceful) {
+         char char_of_death = AP_PERUSER_CHAR_OF_DEATH;
+ 
+@@ -2696,14 +2703,6 @@
+         }
+         _DBG("Total children of %d leaving behind for graceful restart (%d living)", 
+                        grace_children, grace_children_alive);
+-
+-       /* destroy server_env_image */
+-        for (i = 0; i < NUM_SENV; i++)
+-        {
+-            close(SENV[i].input);
+-            close(SENV[i].output);
+-        }
+-       cleanup_server_environments(NULL);
+     }
+     else {
+ 	/* Kill 'em off */
+@@ -2861,40 +2860,41 @@
+         return rv;
+     }
+ 
++    if (!child_info_image) {
++        _DBG("Initializing child_info_table", 0);
++        child_info_size = tmp_server_limit * sizeof(child_info_t) + sizeof(apr_size_t);
+ 
+-    _DBG("Initializing child_info_table", 0);
+-    child_info_size = tmp_server_limit * sizeof(child_info_t) + sizeof(apr_size_t);
++        rv = apr_shm_create(&child_info_shm, child_info_size, NULL, global_pool);
+ 
+-    rv = apr_shm_create(&child_info_shm, child_info_size, NULL, global_pool);
++        /*  if ((rv != APR_SUCCESS) && (rv != APR_ENOTIMPL)) { */
++        if (rv != APR_SUCCESS) {
++            _DBG("shared memory creation failed", 0);
+ 
+-/*  if ((rv != APR_SUCCESS) && (rv != APR_ENOTIMPL)) { */
+-    if (rv != APR_SUCCESS) {
+-        _DBG("shared memory creation failed", 0);
++            ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL,
++                         "Unable to create shared memory segment "
++                         "(anonymous shared memory failure)");
++        }
++        else if (rv == APR_ENOTIMPL) {
++            _DBG("anonymous shared memory not available", 0);
++            /* TODO: make up a filename and do name-based shmem */
++        }
+ 
+-        ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL,
+-                     "Unable to create shared memory segment "
+-                     "(anonymous shared memory failure)");
+-    }
+-    else if (rv == APR_ENOTIMPL) {
+-        _DBG("anonymous shared memory not available", 0);
+-        /* TODO: make up a filename and do name-based shmem */
+-    }
++        if (rv || !(shmem = apr_shm_baseaddr_get(child_info_shm))) {
++            _DBG("apr_shm_baseaddr_get() failed", 0);
++            return HTTP_INTERNAL_SERVER_ERROR;
++        }
+ 
+-    if (rv || !(shmem = apr_shm_baseaddr_get(child_info_shm))) {
+-        _DBG("apr_shm_baseaddr_get() failed", 0);
+-        return HTTP_INTERNAL_SERVER_ERROR;
++        memset(shmem, 0, child_info_size);
++        child_info_image = (child_info*)apr_palloc(global_pool, sizeof(child_info));
++        child_info_image->control = (child_info_control*)shmem;
++        shmem += sizeof(child_info_control);
++        child_info_image->table = (child_info_t*)shmem;
+     }
+ 
+-    memset(shmem, 0, sizeof(child_info_size));
+-    child_info_image = (child_info*)calloc(1, sizeof(child_info_size));
+-    child_info_image->control = (child_info_control*)shmem;
+-    shmem += sizeof(child_info_control*);
+-    child_info_image->table = (child_info_t*)shmem;
+-
++    _DBG("Clearing child_info_table");
+     child_info_image->control->num = 0;
+ 
+-    for (i = 0; i < tmp_server_limit; i++)
+-    {
++    for (i = 0; i < tmp_server_limit; i++) {
+         CHILD_INFO_TABLE[i].pid     = 0;
+         CHILD_INFO_TABLE[i].senv    = (server_env_t*)NULL;
+         CHILD_INFO_TABLE[i].type    = CHILD_TYPE_UNKNOWN;
+@@ -2927,25 +2927,23 @@
+             return HTTP_INTERNAL_SERVER_ERROR;
+         }
+ 
+-        memset(shmem, 0, sizeof(server_env_size));
+-        server_env_image = (server_env*)calloc(1, sizeof(server_env_size));
++        memset(shmem, 0, server_env_size);
++        server_env_image = (server_env*)apr_palloc(global_pool, sizeof(server_env));
+         server_env_image->control = (server_env_control*)shmem;
+-        shmem += sizeof(server_env_control*);
++        shmem += sizeof(server_env_control);
+         server_env_image->table = (server_env_t*)shmem;
+     }
+-
+-    if(restart_num <= 2) {
+-        _DBG("Cleaning server environments table");
+     
+-        server_env_image->control->num = 0;
+-        for (i = 0; i < tmp_server_limit; i++) {
+-            SENV[i].processor_id = -1;
+-            SENV[i].uid          = -1;
+-            SENV[i].gid          = -1;
+-            SENV[i].chroot       = NULL;
+-            SENV[i].input        = -1;
+-            SENV[i].output       = -1;
+-        }
++    _DBG("Clearing server environment table");
++    server_env_image->control->num = 0;    
++
++    for (i = 0; i < tmp_server_limit; i++) {
++        SENV[i].processor_id = -1;
++        SENV[i].uid          = -1;
++        SENV[i].gid          = -1;
++        SENV[i].chroot       = NULL;
++        SENV[i].input        = -1;
++        SENV[i].output       = -1;
+     }
+ 
+     return OK;
+@@ -3196,14 +3194,11 @@
+                             "Error: Directive %s> takes one argument", cmd->cmd->name);
+     }
+ 
+-    /*	Check for existing processors on first launch and between gracefuls */
+-    if (restart_num == 1 || is_graceful) {
+-        server_env_t *old_senv = find_senv_by_name(senv.name);
++    server_env_t *old_senv = find_senv_by_name(senv.name);
+ 
+-        if (old_senv) {
+-            return apr_psprintf(cmd->temp_pool,
+-                                "Error: Processor %s already defined", senv.name);
+-        }
++    if (old_senv) {
++        return apr_psprintf(cmd->temp_pool,
++                            "Error: Processor %s already defined", senv.name);
+     }
+ 
+     senv.nice_lvl 		= 0;


>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list