From 43b472601dc0ccefac66cabaf564ce85d6014762 Mon Sep 17 00:00:00 2001 From: sin Date: Thu, 13 Feb 2014 13:02:12 +0000 Subject: [PATCH] Return proper error values in case execvp() fails --- chroot.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/chroot.c b/chroot.c index 92263c1..9569ad8 100644 --- a/chroot.c +++ b/chroot.c @@ -1,4 +1,5 @@ /* See LICENSE file for copyright and license details. */ +#include #include #include #include "util.h" @@ -8,7 +9,8 @@ static void usage(void); int main(int argc, char **argv) { - char *shell[] = { "/bin/sh", "-i", NULL }, *aux; + char *shell[] = { "/bin/sh", "-i", NULL }, *aux, *p; + int savederrno; ARGBEGIN { default: @@ -22,18 +24,22 @@ main(int argc, char **argv) shell[0] = aux; if(chroot(argv[0]) == -1) - eprintf("chroot: '%s':", argv[0]); + eprintf("chroot %s:", argv[0]); if(chdir("/") == -1) - eprintf("chroot:"); + eprintf("chdir:"); if(argc == 1) { + p = *shell; execvp(*shell, shell); } else { + p = argv[1]; execvp(argv[1], argv+1); } - eprintf("chroot: '%s':", argv[1]); + savederrno = errno; + weprintf("execvp %s:", p); + _exit(savederrno == ENOENT ? 127 : 126); return EXIT_FAILURE; }