diff options
author | Alfonso Gregory <gfunni234@gmail.com> | 2023-07-07 21:54:26 +0000 |
---|---|---|
committer | Warner Losh <imp@FreeBSD.org> | 2023-07-07 21:56:35 +0000 |
commit | 38f57faa06cf1b96568eac6cb270c1748f3fde43 (patch) | |
tree | c60ce5d587375beb7a0c312e609c7533ada40a7d | |
parent | 348ec8dc036bf4ba1f607bb8acb25a0358436cc7 (diff) | |
download | src-38f57faa06cf1b96568eac6cb270c1748f3fde43.tar.gz src-38f57faa06cf1b96568eac6cb270c1748f3fde43.zip |
cat: ensure serrno is always set
Set serrno to errno before the loop begins for the edge case that res0
is immediately NULL.
Reviewed by: imp
Pull Request: https://github.com/freebsd/freebsd-src/pull/724
-rw-r--r-- | bin/cat/cat.c | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/bin/cat/cat.c b/bin/cat/cat.c index 5a1fab0c26a0..a58bbe93835e 100644 --- a/bin/cat/cat.c +++ b/bin/cat/cat.c @@ -436,7 +436,6 @@ udom_open(const char *path, int flags) */ bzero(&hints, sizeof(hints)); hints.ai_family = AF_LOCAL; - fd = -1; if (fileargs_realpath(fa, path, rpath) == NULL) return (-1); @@ -449,6 +448,10 @@ udom_open(const char *path, int flags) } cap_rights_init(&rights, CAP_CONNECT, CAP_READ, CAP_WRITE, CAP_SHUTDOWN, CAP_FSTAT, CAP_FCNTL); + + /* Default error if something goes wrong. */ + serrno = EINVAL; + for (res = res0; res != NULL; res = res->ai_next) { fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); @@ -471,39 +474,40 @@ udom_open(const char *path, int flags) else { serrno = errno; close(fd); - fd = -1; } } freeaddrinfo(res0); + if (res == NULL) { + errno = serrno; + return (-1); + } + /* * handle the open flags by shutting down appropriate directions */ - if (fd >= 0) { - switch(flags & O_ACCMODE) { - case O_RDONLY: - cap_rights_clear(&rights, CAP_WRITE); - if (shutdown(fd, SHUT_WR) == -1) - warn(NULL); - break; - case O_WRONLY: - cap_rights_clear(&rights, CAP_READ); - if (shutdown(fd, SHUT_RD) == -1) - warn(NULL); - break; - default: - break; - } - cap_rights_clear(&rights, CAP_CONNECT, CAP_SHUTDOWN); - if (caph_rights_limit(fd, &rights) < 0) { - serrno = errno; - close(fd); - errno = serrno; - return (-1); - } - } else { + switch (flags & O_ACCMODE) { + case O_RDONLY: + cap_rights_clear(&rights, CAP_WRITE); + if (shutdown(fd, SHUT_WR) == -1) + warn(NULL); + break; + case O_WRONLY: + cap_rights_clear(&rights, CAP_READ); + if (shutdown(fd, SHUT_RD) == -1) + warn(NULL); + break; + default: + break; + } + + cap_rights_clear(&rights, CAP_CONNECT, CAP_SHUTDOWN); + if (caph_rights_limit(fd, &rights) < 0) { + serrno = errno; + close(fd); errno = serrno; + return (-1); } return (fd); } |