diff options
-rw-r--r-- | util/nvmutil/nvmutil.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c index 524e678e..26c31d2c 100644 --- a/util/nvmutil/nvmutil.c +++ b/util/nvmutil/nvmutil.c @@ -57,6 +57,7 @@ void setWord(int pos16, int partnum, uint16_t val16); void byteswap(int n, int partnum); void writeGbeFile(int *fd, const char *filename, size_t nw); void xpledge(const char *promises, const char *execpromises); +void xunveil(const char *path, const char *permissions); #define FILENAME argv[1] #define COMMAND argv[2] @@ -79,7 +80,7 @@ uint8_t big_endian; int main(int argc, char *argv[]) { - xpledge("stdio rpath wpath", NULL); + xpledge("stdio rpath wpath unveil", NULL); size_t nr = 128; int fd, flags = O_RDWR; void (*cmd)(void) = NULL; @@ -92,7 +93,7 @@ main(int argc, char *argv[]) if (argc == 3) { if (strcmp(COMMAND, "dump") == 0) { - xpledge("stdio rpath", NULL); + xpledge("stdio rpath unveil", NULL); flags = O_RDONLY; cmd = &cmd_dump; } else if (strcmp(COMMAND, "setmac") == 0) { @@ -125,16 +126,20 @@ main(int argc, char *argv[]) (cmd == &cmd_setchecksum) | (cmd == &cmd_brick); readGbeFile(&fd, FILENAME, flags, nr); (void)rhex(); - if (flags == O_RDONLY) + xunveil("/dev/urandom", "r"); + if (flags == O_RDONLY) { xpledge("stdio", NULL); - else - xpledge("stdio wpath", NULL); + } else { + xpledge("stdio wpath unveil", NULL); + xunveil(FILENAME, "w"); + } if (strMac != NULL) cmd_setmac(strMac); /* nvm gbe.bin setmac */ else if (cmd != NULL) (*cmd)(); /* all other commands except setmac */ writeGbeFile(&fd, FILENAME, nr); - } + } else + xpledge("stdio", NULL); if ((errno != 0) && (cmd != &cmd_dump)) err(errno, NULL); @@ -381,3 +386,13 @@ xpledge(const char *promises, const char *execpromises) err(errno, NULL); #endif } + +void +xunveil(const char *path, const char *permissions) +{ + (void)path; (void)permissions; +#ifdef __OpenBSD__ + if (unveil(path, permissions) == -1) + err(errno, NULL); +#endif +} |