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 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