]> granicus.if.org Git - apache/commitdiff
Fix for suexec invocation of CGIs under user dirs when using cgid
authorBrian Pane <brianp@apache.org>
Sun, 26 May 2002 22:10:55 +0000 (22:10 +0000)
committerBrian Pane <brianp@apache.org>
Sun, 26 May 2002 22:10:55 +0000 (22:10 +0000)
PR: 7810
Submitted by: Colm MacCarthaigh <colmmacc@redbrick.dcu.ie>
Reviewed by: Brian Pane

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

CHANGES
modules/generators/mod_cgid.c

diff --git a/CHANGES b/CHANGES
index eb03edb17f47e756d35be92d8ac1911451d9e65a..86ded713eb078dfaf7a06db1492d63be1541b31e 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,8 @@
 Changes with Apache 2.0.37
 
+  *) Fix the combination of mod_cgid, mod_setuexec, and mod_userdir.
+     PR 7810  [Colm MacCarthaigh <colmmacc@redbrick.dcu.ie>]
+
   *) Fix suexec execution of CGI scripts from mod_include.
      PR 7791, 8291  [Colm MacCarthaigh <colmmacc@redbrick.dcu.ie>]
 
index b5107edbe4bf276390e9ba5a311cae844f44102a..aee665cc5792cf6779f615c95e56c12dfe644f0c 100644 (file)
@@ -329,16 +329,8 @@ static int get_req(int fd, request_rec *r, char **argv0, char ***env, int *req_t
         if (rc != sizeof(int)) {
             return 1;
         }
-        rc = read(fd, &suexec_cfg->ugid.uid, sizeof(uid_t));
-        if (rc != sizeof(uid_t)) {
-            return 1;
-        }
-        rc = read(fd, &suexec_cfg->ugid.gid, sizeof(gid_t));
-        if (rc != sizeof(gid_t)) {
-            return 1;
-        }
-        rc = read(fd, &suexec_cfg->active, sizeof(int));
-        if (rc != sizeof(int)) {
+        rc = read(fd, suexec_cfg, sizeof(*suexec_cfg));
+        if (rc != sizeof(*suexec_cfg)) {
             return 1;
         }
         dconf[i] = (void *)suexec_cfg;
@@ -379,12 +371,20 @@ static int get_req(int fd, request_rec *r, char **argv0, char ***env, int *req_t
     } 
 #endif 
 #endif
-    /* For right now, just make the notes table.  At some point we will need
-     * to actually fill this out, but for now we just don't want suexec to
-     * seg fault.
-     */
+
+    /* basic notes table to avoid segfaults */
     r->notes = apr_table_make(r->pool, 1);
 
+    /* mod_userdir requires the mod_userdir_user note */
+    rc = read(fd, &len, sizeof(len));
+    if ((rc == sizeof(len)) && len) {
+        data = apr_pcalloc(r->pool, len + 1); /* last byte is '\0' */
+        rc = read(fd, data, len);
+        if(rc != len) {
+           return 1;
+        }
+       apr_table_set(r->notes,"mod_userdir_user", data);
+    }
     return 0;
 } 
 
@@ -441,9 +441,7 @@ static void send_req(int fd, request_rec *r, char *argv0, char **env, int req_ty
                                                            suexec_mod);
 
         write(fd, &suexec_mod->module_index, sizeof(int));
-        write(fd, &suexec_cfg->ugid.uid, sizeof(uid_t));
-        write(fd, &suexec_cfg->ugid.gid, sizeof(gid_t));
-        write(fd, &suexec_cfg->active, sizeof(int));
+        write(fd, suexec_cfg, sizeof(*suexec_cfg));
     }
 
 #if 0
@@ -483,6 +481,16 @@ static void send_req(int fd, request_rec *r, char *argv0, char **env, int req_ty
     } 
 #endif
 #endif 
+   /* send a minimal notes table */
+   data  = (char *) apr_table_get(r->notes, "mod_userdir_user");
+   if(data != NULL) {
+       len = strlen(data);
+       write(fd, &len, sizeof(len));
+       write(fd, data, len);
+   } else {
+       len = 0;
+       write(fd, &len, sizeof(len));
+   }
 } 
 
 static void daemon_signal_handler(int sig)