Download | Plain Text | Line Numbers


--- src/support/suexec.c.orig	2005-11-17 20:18:09.000000000 +0100
+++ src/support/suexec.c	2005-11-17 20:39:41.000000000 +0100
@@ -486,6 +486,7 @@
     struct group *gr;		/* group entry holder        */
     struct stat dir_info;	/* directory info holder     */
     struct stat prg_info;	/* program info holder       */
+    int skip_checks = 0;
 
     /*
      * Start with a "clean" environment
@@ -735,7 +736,19 @@
 	}
     }
 
-    if ((strncmp(cwd, dwd, strlen(dwd))) != 0) {
+    const char *phpcgipath1 = "/usr/lib/php5/bin";
+    const char *phpcgipath2 = "/usr/lib/php4/bin";
+    const char *phpcgipath3 = "/usr/local/bin";
+    const char *phpcgiexec = "php-cgi-wrapper";
+    if ((!strncmp(cwd, phpcgipath1, strlen(phpcgipath1)) ||
+	!strncmp(cwd, phpcgipath2, strlen(phpcgipath2)) ||
+	!strncmp(cwd, phpcgipath3, strlen(phpcgipath3))) &&
+	!strncmp(cmd, phpcgiexec, strlen(phpcgiexec))) {
+	skip_checks = 1;
+    }
+
+    if (!skip_checks &&
+	(strncmp(cwd, dwd, strlen(dwd))) != 0) {
 	log_err("error: command not in docroot (%s/%s)\n", cwd, cmd);
 	exit(114);
     }
@@ -794,10 +803,11 @@
      * Error out if the target name/group is different from
      * the name/group of the cwd or the program.
      */
-    if ((uid != dir_info.st_uid) ||
+    if (!skip_checks && 
+	((uid != dir_info.st_uid) ||
 	(gid != dir_info.st_gid) ||
 	(uid != prg_info.st_uid) ||
-	(gid != prg_info.st_gid)) {
+	(gid != prg_info.st_gid))) {
 	log_err("error: target uid/gid (%ld/%ld) mismatch "
 		"with directory (%ld/%ld) or program (%ld/%ld)\n",
 		uid, gid,