You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by "MATHIHALLI,MADHUSUDAN (HP-Cupertino,ex1)" <ma...@hp.com> on 2003/09/24 23:19:58 UTC

[PATCH] mod_cgid dumps core

Hi,
	When I tried to patch 2.0.47 with the mod_cgid restart patch, I got
several SEGV's while running the Apache Perl-framework tests.. The error (I
believe) is because of the way in which the memory for procnew data
structure is allocated in cgid_init().

	As I understand, the memory allocation was moved from the parent
process to the initial startup process - was this intentional ?. I don't
expect that to work very well - the following patch fixes the problem.

Any comments,
-Madhu


Index: mod_cgid.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/generators/mod_cgid.c,v
retrieving revision 1.156
diff -u -r1.156 mod_cgid.c
--- mod_cgid.c  3 Sep 2003 19:27:05 -0000       1.156
+++ mod_cgid.c  24 Sep 2003 21:05:54 -0000
@@ -816,6 +816,7 @@
                      server_rec *main_server) 
 { 
     apr_proc_t *procnew = NULL;
+    void *data;
     int first_time = 0;
     const char *userdata_key = "cgid_init";
     module **m;
@@ -824,14 +825,11 @@
     root_server = main_server;
     root_pool = p;
 
-    apr_pool_userdata_get((void **)&procnew, userdata_key,
main_server->process->pool);
-    if (!procnew) {
+    apr_pool_userdata_get(&data, userdata_key, main_server->process->pool);
+    if (!data) {
         first_time = 1;
-        procnew = apr_pcalloc(p, sizeof(*procnew));
-        procnew->pid = -1;
-        procnew->err = procnew->in = procnew->out = NULL;
-        apr_pool_userdata_set((const void *)procnew, userdata_key,
-                     apr_pool_cleanup_null, main_server->process->pool);
+        apr_pool_userdata_set((void *)1, userdata_key,
apr_pool_cleanup_null,
+                              main_server->process->pool);
     }
 
     if (!first_time) {
@@ -839,6 +837,7 @@
         for (m = ap_preloaded_modules; *m != NULL; m++)
             total_modules++;
 
+        procnew = apr_pcalloc(p, sizeof(*procnew));
         ret = cgid_start(p, main_server, procnew);
         if (ret != OK ) {
             return ret;