1 diff -urNp httpd-2.4.4.orig/support/suexec.c httpd-2.4.4/support/suexec.c
2 --- httpd-2.4.4.orig/support/suexec.c 2012-12-03 16:33:42.000000000 +0000
3 +++ httpd-2.4.4/support/suexec.c 2013-07-11 11:49:54.250178570 +0000
4 @@ -240,6 +240,21 @@ static void clean_env(void)
9 + * Return the `basename' of the pathname in STRING (the stuff after
10 + * the last '/'). If STRING is `/', just return it. Taken from bash.
12 +char *base_pathname(char *string)
16 + if (string[0] == '/' && string[1] == 0)
19 + p = (char *)strrchr (string, '/');
20 + return (p ? ++p : string);
23 int main(int argc, char *argv[])
25 int userdir = 0; /* ~userdir flag */
26 @@ -255,6 +270,7 @@ int main(int argc, char *argv[])
27 char dwd[AP_MAXPATH]; /* docroot working directory */
28 struct passwd *pw; /* password entry holder */
29 struct group *gr; /* group entry holder */
30 + struct passwd tpw; /* tmp password entry holder */
31 struct stat dir_info; /* directory info holder */
32 struct stat prg_info; /* program info holder */
34 @@ -375,8 +391,23 @@ int main(int argc, char *argv[])
37 if ((pw = getpwuid(atoi(target_uname))) == NULL) {
38 - log_err("invalid target user id: (%s)\n", target_uname);
41 + * If called as suexec.fcgi ignore if there is no passwd
42 + * entry for specified UID. Also bail out if UID = 0.
44 + if(!strcmp(base_pathname(argv[0]),"suexec.fcgi")) {
45 + tpw.pw_name = strdup(target_uname);
46 + tpw.pw_uid = atoi(target_uname);
47 + tpw.pw_dir = (char *)"/tmp";
49 + if (tpw.pw_uid <= 0) {
50 + log_err("invalid target user id: (%s)\n", target_uname);
54 + log_err("invalid target user id: (%s)\n", target_uname);
60 @@ -555,20 +586,24 @@ int main(int argc, char *argv[])
64 - * Error out if the target name/group is different from
65 - * the name/group of the cwd or the program.
67 - if ((uid != dir_info.st_uid) ||
68 - (gid != dir_info.st_gid) ||
69 - (uid != prg_info.st_uid) ||
70 - (gid != prg_info.st_gid)) {
71 - log_err("target uid/gid (%lu/%lu) mismatch "
72 - "with directory (%lu/%lu) or program (%lu/%lu)\n",
73 - (unsigned long)uid, (unsigned long)gid,
74 - (unsigned long)dir_info.st_uid, (unsigned long)dir_info.st_gid,
75 - (unsigned long)prg_info.st_uid, (unsigned long)prg_info.st_gid);
77 + * If not called as suexec.fcgi error out if the target
78 + * name/group is different from the name/group of the cwd
81 + if(strcmp(base_pathname(argv[0]),"suexec.fcgi")) {
82 + if ((uid != dir_info.st_uid) ||
83 + (gid != dir_info.st_gid) ||
84 + (uid != prg_info.st_uid) ||
85 + (gid != prg_info.st_gid)) {
86 + log_err("target uid/gid (%lu/%lu) mismatch "
87 + "with directory (%lu/%lu) or program (%lu/%lu)\n",
88 + (unsigned long)uid, (unsigned long)gid,
89 + (unsigned long)dir_info.st_uid, (unsigned long)dir_info.st_gid,
90 + (unsigned long)prg_info.st_uid, (unsigned long)prg_info.st_gid);
96 * Error out if the program is not executable for the user.
97 * Otherwise, she won't find any error in the logs except for