It always returns -1 until the world changes in some subtle way, then the code is wrong.
The logic is supposed to return what execve returns, not reinvent the value. Over decades this kind of assumption can turn into a bug, so I prefer to do it right. Alejandro Colomar (man-pages) <[email protected]> wrote: > Hello Theo, > > On 9/16/21 10:53 PM, Theo de Raadt wrote: > > @@ -45,25 +46,31 @@ execl(const char *name, const char *arg, > > { > > va_list ap; > > char **argv; > > - int n; > > + size_t maplen; > > + int save_errno, n, error; > > See below. > > > va_start(ap, arg); > > n = 1; > > while (va_arg(ap, char *) != NULL) > > n++; > > va_end(ap); > > - argv = alloca((n + 1) * sizeof(*argv)); > > - if (argv == NULL) { > > - errno = ENOMEM; > > + maplen = (n + 1) * sizeof(*argv); > > + argv = mmap(NULL, maplen, PROT_WRITE|PROT_READ, > > + MAP_ANON|MAP_PRIVATE, -1, 0); > > + if (argv == MAP_FAILED) > > return (-1); > > - } > > va_start(ap, arg); > > n = 1; > > argv[0] = (char *)arg; > > while ((argv[n] = va_arg(ap, char *)) != NULL) > > n++; > > va_end(ap); > > - return (execve(name, argv, environ)); > > + > > + error = execve(name, argv, environ); > > + save_errno = errno; > > + munmap(argv, maplen); > > + errno = save_errno; > > + return (error); > > This part could be simplified to: > > (void) execve(name, argv, environ); > save_errno = errno; > munmap(argv, maplen); > errno = save_errno; > return -1; > > Allowing to remove the error variable. execve(2) always returns -1. > > > } > > DEF_WEAK(execl); > > @@ -72,18 +79,21 @@ execle(const char *name, const char *arg > > { > > va_list ap; > > char **argv, **envp; > > - int n; > > + size_t maplen; > > + int save_errno, n, error; > > Same here. > > > @@ -91,7 +101,12 @@ execle(const char *name, const char *arg > > n++; > > envp = va_arg(ap, char **); > > va_end(ap); > > - return (execve(name, argv, envp)); > > + > > + error = execve(name, argv, envp); > > + save_errno = errno; > > + munmap(argv, maplen); > > + errno = save_errno; > > + return error; > > Same here > > > @@ -99,25 +114,32 @@ execlp(const char *name, const char *arg > > { > > va_list ap; > > char **argv; > > - int n; > > + size_t maplen; > > + int save_errno, n, error; > > Same here. > > > > -- > Alejandro Colomar > Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/ > http://www.alejandro-colomar.es/
