1 /* $OpenBSD: execpromise.c,v 1.2 2021/12/13 18:04:28 deraadt Exp $ */
2 /*
3 * Copyright (c) 2017 Florian Obser <florian@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18 #include <sys/types.h>
19 #include <sys/socket.h>
20
21 #include <err.h>
22 #include <errno.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <unistd.h>
26
27 int
main(int argc,char ** argv)28 main(int argc, char **argv)
29 {
30 int ch, child = 0, s;
31 char **oargv = argv;
32
33 while ((ch = getopt(argc, argv, "C")) != -1) {
34 switch (ch) {
35 case 'C':
36 child = 1;
37 break;
38 default:
39 errx(1, "");
40 }
41 }
42 argc -= optind;
43 argv += optind;
44
45 if (child ==1) {
46 warnx("child");
47 if (argc > 1)
48 errx(1, "argc: %d", argc);
49 if (argc == 1) {
50 warnx("plege(\"%s\",\"\")", argv[0]);
51 if (pledge(argv[0], "") == -1)
52 err(24, "child pledge");
53 }
54
55 warnx("trying to open socket");
56
57 s = socket(AF_INET, SOCK_DGRAM, 0);
58 if (s == -1)
59 err(23, "open");
60 else
61 warnx("opened socket");
62
63 close(s);
64 exit(0);
65 } else {
66 warnx("parent");
67 if (argc == 2)
68 warnx("execpromise: \"%s\", child pledge: \"%s\"",
69 argv[0], argv[1]);
70 else if (argc == 1)
71 warnx("execpromise: \"%s\"", argv[0]);
72 else
73 errx(1, "argc out of range");
74
75 if (pledge("stdio exec", argv[0]) == -1)
76 err(1, "parent pledge");
77
78 oargv[1] = "-C";
79 execvp(oargv[0], &oargv[0]);
80 err((errno == ENOENT) ? 127 : 126, "%s", argv[0]);
81 }
82 }
83