Loading...
gen/FreeBSD/exec.c Libc-1725.40.4 Libc-498
--- Libc/Libc-1725.40.4/gen/FreeBSD/exec.c
+++ Libc/Libc-498/gen/FreeBSD/exec.c
@@ -1,6 +1,4 @@
 /*-
- * SPDX-License-Identifier: BSD-3-Clause
- *
  * Copyright (c) 1991, 1993
  *	The Regents of the University of California.  All rights reserved.
  *
@@ -12,7 +10,11 @@
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
@@ -33,10 +35,11 @@
 static char sccsid[] = "@(#)exec.c	8.1 (Berkeley) 6/4/93";
 #endif /* LIBC_SCCS and not lint */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/gen/exec.c,v 1.27 2009/12/05 18:55:16 ed Exp $");
+__FBSDID("$FreeBSD: src/lib/libc/gen/exec.c,v 1.22 2003/07/01 12:30:03 bde Exp $");
 
 #include "namespace.h"
 #include <sys/param.h>
+#include <sys/types.h>
 #include <sys/stat.h>
 #include <errno.h>
 #include <unistd.h>
@@ -47,22 +50,14 @@
 
 #include <stdarg.h>
 #include "un-namespace.h"
-#include "libc_private.h"
-
-#include <crt_externs.h>
-#define environ (*_NSGetEnviron())
-
-static const char execvPe_err_preamble[] = "execvP: ";
-static const char execvPe_err_trailer[] = ": path too long\n";
-
-int
-_execvpe(const char *name, char * const argv[], char * const envp[]);
+
+extern char **environ;
 
 int
 execl(const char *name, const char *arg, ...)
 {
 	va_list ap;
-	const char **argv;
+	char **argv;
 	int n;
 
 	va_start(ap, arg);
@@ -77,19 +72,18 @@
 	}
 	va_start(ap, arg);
 	n = 1;
-	argv[0] = arg;
+	argv[0] = (char *)arg;
 	while ((argv[n] = va_arg(ap, char *)) != NULL)
 		n++;
 	va_end(ap);
-	return (_execve(name, __DECONST(char **, argv), environ));
+	return (_execve(name, argv, environ));
 }
 
 int
 execle(const char *name, const char *arg, ...)
 {
 	va_list ap;
-	const char **argv;
-	char **envp;
+	char **argv, **envp;
 	int n;
 
 	va_start(ap, arg);
@@ -104,19 +98,19 @@
 	}
 	va_start(ap, arg);
 	n = 1;
-	argv[0] = arg;
+	argv[0] = (char *)arg;
 	while ((argv[n] = va_arg(ap, char *)) != NULL)
 		n++;
 	envp = va_arg(ap, char **);
 	va_end(ap);
-	return (_execve(name, __DECONST(char **, argv), envp));
+	return (_execve(name, argv, envp));
 }
 
 int
 execlp(const char *name, const char *arg, ...)
 {
 	va_list ap;
-	const char **argv;
+	char **argv;
 	int n;
 
 	va_start(ap, arg);
@@ -131,15 +125,17 @@
 	}
 	va_start(ap, arg);
 	n = 1;
-	argv[0] = arg;
+	argv[0] = (char *)arg;
 	while ((argv[n] = va_arg(ap, char *)) != NULL)
 		n++;
 	va_end(ap);
-	return (execvp(name, __DECONST(char **, argv)));
-}
-
-int
-execv(const char *name, char * const *argv)
+	return (execvp(name, argv));
+}
+
+int
+execv(name, argv)
+	const char *name;
+	char * const *argv;
 {
 	(void)_execve(name, argv, environ);
 	return (-1);
@@ -148,30 +144,34 @@
 int
 execvp(const char *name, char * const *argv)
 {
-	return (_execvpe(name, argv, environ));
-}
-
-static int
-execvPe(const char *name, const char *path, char * const *argv,
-    char * const *envp)
-{
-	const char **memp;
-	size_t cnt, lp, ln;
+	const char *path;
+
+	/* Get the path we're searching. */
+	if ((path = getenv("PATH")) == NULL)
+		path = _PATH_DEFPATH;
+
+	return (execvP(name, path, argv));
+}
+
+int
+execvP(name, path, argv)
+	const char *name;
+	const char *path;
+	char * const *argv;
+{
+	char **memp;
+	int cnt, lp, ln;
+	char *p;
 	int eacces, save_errno;
-	char buf[MAXPATHLEN];
-	const char *bp, *np, *op, *p;
+	char *bp, *cur, buf[MAXPATHLEN];
 	struct stat sb;
 
 	eacces = 0;
 
 	/* If it's an absolute or relative path name, it's easy. */
-	if (strchr(name, '/')) {
-		bp = name;
-#ifdef __APPLE__
-		/* Used to differentiate PATH search vs. not afterwards. */
-		path = NULL;
-#endif
-		op = NULL;
+	if (index(name, '/')) {
+		bp = (char *)name;
+		cur = NULL;
 		goto retry;
 	}
 	bp = buf;
@@ -182,30 +182,23 @@
 		return (-1);
 	}
 
-	op = path;
-	ln = strlen(name);
-	while (op != NULL) {
-		np = strchrnul(op, ':');
-
+	cur = alloca(strlen(path) + 1);
+	if (cur == NULL) {
+		errno = ENOMEM;
+		return (-1);
+	}
+	strcpy(cur, path);
+	while ((p = strsep(&cur, ":")) != NULL) {
 		/*
 		 * It's a SHELL path -- double, leading and trailing colons
 		 * mean the current directory.
 		 */
-		if (np == op) {
-			/* Empty component. */
+		if (*p == '\0') {
 			p = ".";
 			lp = 1;
-		} else {
-			/* Non-empty component. */
-			p = op;
-			lp = np - op;
-		}
-
-		/* Advance to the next component or terminate after this. */
-		if (*np == '\0')
-			op = NULL;
-		else
-			op = np + 1;
+		} else
+			lp = strlen(p);
+		ln = strlen(name);
 
 		/*
 		 * If the path is too long complain.  This is a possible
@@ -213,11 +206,10 @@
 		 * the user may execute the wrong program.
 		 */
 		if (lp + ln + 2 > sizeof(buf)) {
-			(void)_write(STDERR_FILENO, execvPe_err_preamble,
-			    sizeof(execvPe_err_preamble) - 1);
+			(void)_write(STDERR_FILENO, "execvP: ", 8);
 			(void)_write(STDERR_FILENO, p, lp);
-			(void)_write(STDERR_FILENO, execvPe_err_trailer,
-			    sizeof(execvPe_err_trailer) - 1);
+			(void)_write(STDERR_FILENO, ": path too long\n",
+			    16);
 			continue;
 		}
 		bcopy(p, buf, lp);
@@ -225,7 +217,7 @@
 		bcopy(name, buf + lp + 1, ln);
 		buf[lp + ln + 1] = '\0';
 
-retry:		(void)_execve(bp, argv, envp);
+retry:		(void)_execve(bp, argv, environ);
 		switch (errno) {
 		case E2BIG:
 			goto done;
@@ -236,30 +228,15 @@
 		case ENOEXEC:
 			for (cnt = 0; argv[cnt]; ++cnt)
 				;
-
-			/*
-			 * cnt may be 0 above; always allocate at least
-			 * 3 entries so that we can at least fit "sh", bp, and
-			 * the NULL terminator.  We can rely on cnt to take into
-			 * account the NULL terminator in all other scenarios,
-			 * as we drop argv[0].
-			 */
-			memp = alloca(MAX(3, cnt + 2) * sizeof(char *));
+			memp = alloca((cnt + 2) * sizeof(char *));
 			if (memp == NULL) {
 				/* errno = ENOMEM; XXX override ENOEXEC? */
 				goto done;
 			}
-			if (cnt > 0) {
-				memp[0] = argv[0];
-				memp[1] = bp;
-				bcopy(argv + 1, memp + 2, cnt * sizeof(char *));
-			} else {
-				memp[0] = "sh";
-				memp[1] = bp;
-				memp[2] = NULL;
-			}
- 			(void)_execve(_PATH_BSHELL,
-			    __DECONST(char **, memp), envp);
+			memp[0] = "sh";
+			memp[1] = bp;
+			bcopy(argv + 1, memp + 2, cnt * sizeof(char *));
+			(void)_execve(_PATH_BSHELL, memp, environ);
 			goto done;
 		case ENOMEM:
 			goto done;
@@ -289,40 +266,10 @@
 			goto done;
 		}
 	}
-
 	if (eacces)
 		errno = EACCES;
-#ifdef __APPLE__
-	/*
-	 * Preserve errno from execve(2) if it wasn't a PATH search, or
-	 * if it was a PATH search and we bailed out early.  Note that every
-	 * branch in the loop jumps to the `done` label to preserve errno, so
-	 * this is more of a defensive check.
-	 */
-	else if (path != NULL && op == NULL)
-#else
 	else
-#endif
 		errno = ENOENT;
-	/* else use existing errno from _execve */
 done:
 	return (-1);
 }
-
-int
-execvP(const char *name, const char *path, char * const argv[])
-{
-	return execvPe(name, path, argv, environ);
-}
-
-__private_extern__ int
-_execvpe(const char *name, char * const argv[], char * const envp[])
-{
-	const char *path;
-
-	/* Get the path we're searching. */
-	if ((path = getenv("PATH")) == NULL)
-		path = _PATH_DEFPATH;
-
-	return (execvPe(name, path, argv, envp));
-}