summaryrefslogtreecommitdiff
path: root/www/apache13-fp/files/patch-fe
diff options
context:
space:
mode:
authorMatthew Hunt <mph@FreeBSD.org>1998-05-29 04:46:56 +0000
committerMatthew Hunt <mph@FreeBSD.org>1998-05-29 04:46:56 +0000
commit4016f6e5242f7babdc71664ce079f7613d4d53ad (patch)
treecbcc6ac076d25b1ba5be8a47a05d0b80c4a5c8a2 /www/apache13-fp/files/patch-fe
parentActivate apache-fp. (diff)
Import of Apache with MS FrontPage Extensions.
PR: 4878 Submitted by: Scot W. Hetzel <hetzels@westbend.net>, w/input from phk.
Notes
Notes: svn path=/head/; revision=11182
Diffstat (limited to 'www/apache13-fp/files/patch-fe')
-rw-r--r--www/apache13-fp/files/patch-fe247
1 files changed, 247 insertions, 0 deletions
diff --git a/www/apache13-fp/files/patch-fe b/www/apache13-fp/files/patch-fe
new file mode 100644
index 000000000000..f2877b36197c
--- /dev/null
+++ b/www/apache13-fp/files/patch-fe
@@ -0,0 +1,247 @@
+*** support/suexec.c.orig Fri Jan 30 08:45:44 1998
+--- support/suexec.c Fri Apr 24 17:32:21 1998
+***************
+*** 66,71 ****
+--- 66,94 ----
+ *
+ */
+
++ /*
++ * "System" CGI modification 97.05.10 by Rick Franchuk (rickf@netnation.com)
++ *
++ * I found that while it's great to make scripts run under the UID and GID
++ * specified in httpd.conf or what /etc/passwd says is 'cool', suEXEC can
++ * really put a damper on 'System' cgi's, forcing copies of the scripts
++ * to be installed into users' home directories. That didn't seem very
++ * fitting... so I changed it so that the target UID check is disabled in
++ * a system directory #defined in suexec+.h. I hope you all find it useful.
++ *
++ * The docroot check had to be bypassed to allow functionality for VirtualHost
++ * entries. I'm somewhat suprised noone encountered that behavior before.
++ */
++
++ /* "FPEXE modification made on 98.04.24 by Scot Hetzel (hetzels@westbend.net)
++ * based on previous FPEXE modifications supplied by Mark Wormgoor
++ * (riddles@ipe.nl)
++ *
++ * Changes were made in order to use Suexec and Frontpage 98 at the same time.
++ * After we change to the target_uid and target_gid. We check if cmd = FPEXE,
++ * if it does then we execute the cmd without performing any further tests.
++ *
++ */
+
+ #include "suexec.h"
+
+***************
+*** 75,81 ****
+ #include <sys/types.h>
+ #include <stdio.h>
+ #include <stdarg.h>
+! #include <string.h>
+ #include <pwd.h>
+ #include <grp.h>
+ #include <time.h>
+--- 98,104 ----
+ #include <sys/types.h>
+ #include <stdio.h>
+ #include <stdarg.h>
+! #include <strings.h>
+ #include <pwd.h>
+ #include <grp.h>
+ #include <time.h>
+***************
+*** 138,144 ****
+
+ static void err_output(const char *fmt, va_list ap)
+ {
+- #ifdef LOG_EXEC
+ time_t timevar;
+ struct tm *lt;
+
+--- 161,166 ----
+***************
+*** 158,164 ****
+ vfprintf(log, fmt, ap);
+
+ fflush(log);
+- #endif /* LOG_EXEC */
+ return;
+ }
+
+--- 180,185 ----
+***************
+*** 264,270 ****
+ log_err("user mismatch (%s)\n", pw->pw_name);
+ exit(103);
+ }
+!
+ /*
+ * Check for a leading '/' (absolute path) in the command to be executed,
+ * or attempts to back up out of the current directory,
+--- 285,291 ----
+ log_err("user mismatch (%s)\n", pw->pw_name);
+ exit(103);
+ }
+!
+ /*
+ * Check for a leading '/' (absolute path) in the command to be executed,
+ * or attempts to back up out of the current directory,
+***************
+*** 301,306 ****
+--- 322,328 ----
+ /*
+ * Error out if the target group name is invalid.
+ */
++
+ if (strspn(target_gname, "1234567890") != strlen(target_gname)) {
+ if ((gr = getgrnam(target_gname)) == NULL) {
+ log_err("invalid target group name: (%s)\n", target_gname);
+***************
+*** 325,331 ****
+ * Log the transaction here to be sure we have an open log
+ * before we setuid().
+ */
+! log_err("uid: (%s/%s) gid: (%s/%s) %s\n",
+ target_uname, actual_uname,
+ target_gname, actual_gname,
+ cmd);
+--- 347,353 ----
+ * Log the transaction here to be sure we have an open log
+ * before we setuid().
+ */
+! log_err("uid: (%s/%s) gid: (%s/%s) cmd: %s\n",
+ target_uname, actual_uname,
+ target_gname, actual_gname,
+ cmd);
+***************
+*** 357,363 ****
+ * and setgid() to the target group. If unsuccessful, error out.
+ */
+ if (((setgid(gid)) != 0) || (initgroups(actual_uname,gid) != 0)) {
+! log_err("failed to setgid (%ld: %s)\n", gid, cmd);
+ exit(109);
+ }
+
+--- 379,385 ----
+ * and setgid() to the target group. If unsuccessful, error out.
+ */
+ if (((setgid(gid)) != 0) || (initgroups(actual_uname,gid) != 0)) {
+! log_err("failed to setgid (%ld: %s/%s)\n", gid, cwd, cmd);
+ exit(109);
+ }
+
+***************
+*** 365,375 ****
+ * setuid() to the target user. Error out on fail.
+ */
+ if ((setuid(uid)) != 0) {
+! log_err("failed to setuid (%ld: %s)\n", uid, cmd);
+ exit(110);
+ }
+
+ /*
+ * Get the current working directory, as well as the proper
+ * document root (dependant upon whether or not it is a
+ * ~userdir request). Error out if we cannot get either one,
+--- 387,405 ----
+ * setuid() to the target user. Error out on fail.
+ */
+ if ((setuid(uid)) != 0) {
+! log_err("failed to setuid (%ld: %s/%s)\n", uid, cwd, cmd);
+ exit(110);
+ }
+
+ /*
++ * We logged everything, changed to the target uid/gid, and know the
++ * user is ok. We run fpexe now and bail out before anything goes wrong.
++ */
++ #ifdef FPEXE
++ if ((strcmp(cmd, FPEXE)) != NULL) {
++ #endif
++
++ /*
+ * Get the current working directory, as well as the proper
+ * document root (dependant upon whether or not it is a
+ * ~userdir request). Error out if we cannot get either one,
+***************
+*** 402,411 ****
+--- 432,446 ----
+ }
+ }
+
++ /*
++ * This section must be commented out to work properly with
++ * VirtualHosts running CGI in thier own directories.
++ *
+ if ((strncmp(cwd, dwd, strlen(dwd))) != 0) {
+ log_err("command not in docroot (%s/%s)\n", cwd, cmd);
+ exit(114);
+ }
++ */
+
+ /*
+ * Stat the cwd and verify it is a directory, or error out.
+***************
+*** 451,470 ****
+ * 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) ||
+! (gid != dir_info.st_gid) ||
+! (uid != prg_info.st_uid) ||
+! (gid != prg_info.st_gid))
+! {
+! log_err("target uid/gid (%ld/%ld) mismatch with directory (%ld/%ld) or program (%ld/%ld)\n",
+! uid, gid,
+! dir_info.st_uid, dir_info.st_gid,
+! prg_info.st_uid, prg_info.st_gid);
+! exit(120);
+ }
+
+ clean_env();
+
+ /*
+ * Be sure to close the log file so the CGI can't
+ * mess with it. If the exec fails, it will be reopened
+--- 486,516 ----
+ * Error out if the target name/group is different from
+ * the name/group of the cwd or the program.
+ */
+!
+! #ifdef SYSTEM_CGI
+! if (strncmp(cwd, SYSTEM_CGI, strlen(SYSTEM_CGI))) {
+! #endif
+! if ((uid != dir_info.st_uid) ||
+! (gid != dir_info.st_gid) ||
+! (uid != prg_info.st_uid) ||
+! (gid != prg_info.st_gid))
+! {
+! log_err("target uid/gid (%ld/%ld) mismatch with directory %s(%ld/%ld) or program %s(%ld/%ld)\n",
+! uid, gid,
+! cwd, dir_info.st_uid, dir_info.st_gid,
+! cmd, prg_info.st_uid, prg_info.st_gid);
+! exit(120);
+! }
+! #ifdef SYSTEM_CGI
+ }
++ #endif
+
+ clean_env();
+
++ #ifdef FPEXE
++ }
++ #endif
++
+ /*
+ * Be sure to close the log file so the CGI can't
+ * mess with it. If the exec fails, it will be reopened
+***************
+*** 486,491 ****
+--- 532,538 ----
+ *
+ * Oh well, log the failure and error out.
+ */
++
+ log_err("exec failed (%s)\n", cmd);
+ exit(255);
+ }