diff options
| author | David Drysdale <drysdale@google.com> | 2015-01-06 03:23:56 -0500 |
|---|---|---|
| committer | Shuah Khan <shuahkh@osg.samsung.com> | 2015-01-06 14:54:54 -0500 |
| commit | cd805f367633f6540aa287751c270973b7e4cdc9 (patch) | |
| tree | 4f27c3081967f9fcb27fa0424f73f205222d806a /tools/testing/selftests/exec | |
| parent | 6898b627aab6ba553e6d8b40a0b1ddc43c48d42f (diff) | |
selftests/exec: allow shell return code of 126
When the shell fails to invoke a script because its path name
is too long (ENAMETOOLONG), most shells return 127 to indicate
command not found. However, some systems report 126 (which POSIX
suggests should indicate a non-executable file) for this case,
so allow that too.
Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: David Drysdale <drysdale@google.com>
Tested-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Shuah Khan <shuahkh@osg.samsung.com>
Diffstat (limited to 'tools/testing/selftests/exec')
| -rw-r--r-- | tools/testing/selftests/exec/execveat.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/tools/testing/selftests/exec/execveat.c b/tools/testing/selftests/exec/execveat.c index d273624c93a6..e238c9559caf 100644 --- a/tools/testing/selftests/exec/execveat.c +++ b/tools/testing/selftests/exec/execveat.c | |||
| @@ -62,7 +62,7 @@ static int _check_execveat_fail(int fd, const char *path, int flags, | |||
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | static int check_execveat_invoked_rc(int fd, const char *path, int flags, | 64 | static int check_execveat_invoked_rc(int fd, const char *path, int flags, |
| 65 | int expected_rc) | 65 | int expected_rc, int expected_rc2) |
| 66 | { | 66 | { |
| 67 | int status; | 67 | int status; |
| 68 | int rc; | 68 | int rc; |
| @@ -98,9 +98,10 @@ static int check_execveat_invoked_rc(int fd, const char *path, int flags, | |||
| 98 | child, status); | 98 | child, status); |
| 99 | return 1; | 99 | return 1; |
| 100 | } | 100 | } |
| 101 | if (WEXITSTATUS(status) != expected_rc) { | 101 | if ((WEXITSTATUS(status) != expected_rc) && |
| 102 | printf("[FAIL] (child %d exited with %d not %d)\n", | 102 | (WEXITSTATUS(status) != expected_rc2)) { |
| 103 | child, WEXITSTATUS(status), expected_rc); | 103 | printf("[FAIL] (child %d exited with %d not %d nor %d)\n", |
| 104 | child, WEXITSTATUS(status), expected_rc, expected_rc2); | ||
| 104 | return 1; | 105 | return 1; |
| 105 | } | 106 | } |
| 106 | printf("[OK]\n"); | 107 | printf("[OK]\n"); |
| @@ -109,7 +110,7 @@ static int check_execveat_invoked_rc(int fd, const char *path, int flags, | |||
| 109 | 110 | ||
| 110 | static int check_execveat(int fd, const char *path, int flags) | 111 | static int check_execveat(int fd, const char *path, int flags) |
| 111 | { | 112 | { |
| 112 | return check_execveat_invoked_rc(fd, path, flags, 99); | 113 | return check_execveat_invoked_rc(fd, path, flags, 99, 99); |
| 113 | } | 114 | } |
| 114 | 115 | ||
| 115 | static char *concat(const char *left, const char *right) | 116 | static char *concat(const char *left, const char *right) |
| @@ -192,9 +193,15 @@ static int check_execveat_pathmax(int dot_dfd, const char *src, int is_script) | |||
| 192 | * Execute as a long pathname relative to ".". If this is a script, | 193 | * Execute as a long pathname relative to ".". If this is a script, |
| 193 | * the interpreter will launch but fail to open the script because its | 194 | * the interpreter will launch but fail to open the script because its |
| 194 | * name ("/dev/fd/5/xxx....") is bigger than PATH_MAX. | 195 | * name ("/dev/fd/5/xxx....") is bigger than PATH_MAX. |
| 196 | * | ||
| 197 | * The failure code is usually 127 (POSIX: "If a command is not found, | ||
| 198 | * the exit status shall be 127."), but some systems give 126 (POSIX: | ||
| 199 | * "If the command name is found, but it is not an executable utility, | ||
| 200 | * the exit status shall be 126."), so allow either. | ||
| 195 | */ | 201 | */ |
| 196 | if (is_script) | 202 | if (is_script) |
| 197 | fail += check_execveat_invoked_rc(dot_dfd, longpath, 0, 127); | 203 | fail += check_execveat_invoked_rc(dot_dfd, longpath, 0, |
| 204 | 127, 126); | ||
| 198 | else | 205 | else |
| 199 | fail += check_execveat(dot_dfd, longpath, 0); | 206 | fail += check_execveat(dot_dfd, longpath, 0); |
| 200 | 207 | ||
