1*56ac45c1SDavid van Moolenbroek #include <stdlib.h>
2*56ac45c1SDavid van Moolenbroek #include <string.h>
3*56ac45c1SDavid van Moolenbroek #include <limits.h>
4*56ac45c1SDavid van Moolenbroek #include <fcntl.h>
5*56ac45c1SDavid van Moolenbroek #include <sys/wait.h>
6*56ac45c1SDavid van Moolenbroek
7*56ac45c1SDavid van Moolenbroek #include "common.h"
8*56ac45c1SDavid van Moolenbroek
9*56ac45c1SDavid van Moolenbroek /*
10*56ac45c1SDavid van Moolenbroek * Test for dynamic executables with no read permissions. This test relies on
11*56ac45c1SDavid van Moolenbroek * being linked dynamically.
12*56ac45c1SDavid van Moolenbroek */
13*56ac45c1SDavid van Moolenbroek int
main(int argc,char ** argv)14*56ac45c1SDavid van Moolenbroek main(int argc, char ** argv)
15*56ac45c1SDavid van Moolenbroek {
16*56ac45c1SDavid van Moolenbroek char *executable, cp_cmd[PATH_MAX + 9];
17*56ac45c1SDavid van Moolenbroek int status;
18*56ac45c1SDavid van Moolenbroek
19*56ac45c1SDavid van Moolenbroek if (strcmp(argv[0], "DO CHECK") == 0)
20*56ac45c1SDavid van Moolenbroek exit(EXIT_SUCCESS);
21*56ac45c1SDavid van Moolenbroek
22*56ac45c1SDavid van Moolenbroek start(86);
23*56ac45c1SDavid van Moolenbroek
24*56ac45c1SDavid van Moolenbroek /* Make a copy of this binary which is executable-only. */
25*56ac45c1SDavid van Moolenbroek executable = argv[0];
26*56ac45c1SDavid van Moolenbroek
27*56ac45c1SDavid van Moolenbroek snprintf(cp_cmd, sizeof(cp_cmd), "cp ../%s .", executable);
28*56ac45c1SDavid van Moolenbroek status = system(cp_cmd);
29*56ac45c1SDavid van Moolenbroek if (status < 0 || !WIFEXITED(status) ||
30*56ac45c1SDavid van Moolenbroek WEXITSTATUS(status) != EXIT_SUCCESS) e(0);
31*56ac45c1SDavid van Moolenbroek
32*56ac45c1SDavid van Moolenbroek if (chmod(executable, S_IXUSR) != 0) e(0);
33*56ac45c1SDavid van Moolenbroek
34*56ac45c1SDavid van Moolenbroek /* Invoke the changed binary in a child process. */
35*56ac45c1SDavid van Moolenbroek switch (fork()) {
36*56ac45c1SDavid van Moolenbroek case -1:
37*56ac45c1SDavid van Moolenbroek e(0);
38*56ac45c1SDavid van Moolenbroek case 0:
39*56ac45c1SDavid van Moolenbroek execl(executable, "DO CHECK", NULL);
40*56ac45c1SDavid van Moolenbroek
41*56ac45c1SDavid van Moolenbroek exit(EXIT_FAILURE);
42*56ac45c1SDavid van Moolenbroek default:
43*56ac45c1SDavid van Moolenbroek if (wait(&status) <= 0) e(0);
44*56ac45c1SDavid van Moolenbroek if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS)
45*56ac45c1SDavid van Moolenbroek e(0);
46*56ac45c1SDavid van Moolenbroek }
47*56ac45c1SDavid van Moolenbroek
48*56ac45c1SDavid van Moolenbroek quit();
49*56ac45c1SDavid van Moolenbroek /* NOTREACHED */
50*56ac45c1SDavid van Moolenbroek }
51