diff options
author | Michael Tuexen <tuexen@FreeBSD.org> | 2022-10-04 21:34:58 +0000 |
---|---|---|
committer | Michael Tuexen <tuexen@FreeBSD.org> | 2022-10-04 21:40:29 +0000 |
commit | 8ff4fc03e6933dd69f99a8f34f2aa0760300f248 (patch) | |
tree | 68a5e0e2681db37c770b55847e6de64623697aaf | |
parent | b958b862b1f43f5fef881c1f9aee6618d7d24197 (diff) | |
download | src-8ff4fc03e6933dd69f99a8f34f2aa0760300f248.tar.gz src-8ff4fc03e6933dd69f99a8f34f2aa0760300f248.zip |
traceroute6: fix capabilities for the rcv socket
On the receive socket, recvmsg() and poll()/select() is called.
Therefore, CAP_EVENT is needed in addition to CAP_RECV..
While there, check the socket for readbility before calling recvmsg().
Reviewed by: markj@
MFC after: 3 days
Sponsored by: Netflix, Inc.
Differential Revision: https://reviews.freebsd.org/D36878
-rw-r--r-- | usr.sbin/traceroute6/traceroute6.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/usr.sbin/traceroute6/traceroute6.c b/usr.sbin/traceroute6/traceroute6.c index a071c084ad07..d887acf5ae53 100644 --- a/usr.sbin/traceroute6/traceroute6.c +++ b/usr.sbin/traceroute6/traceroute6.c @@ -937,7 +937,7 @@ main(int argc, char *argv[]) strerror(errno)); exit(1); } - cap_rights_init(&rights, CAP_RECV); + cap_rights_init(&rights, CAP_RECV, CAP_EVENT); if (caph_rights_limit(rcvsock, &rights) < 0) { fprintf(stderr, "caph_rights_limit rcvsock: %s\n", strerror(errno)); @@ -1039,7 +1039,8 @@ wait_for_reply(int sock, struct msghdr *mhdr) pfd[0].events = POLLIN; pfd[0].revents = 0; - if (poll(pfd, 1, waittime * 1000) > 0) + if (poll(pfd, 1, waittime * 1000) > 0 && + pfd[0].revents & POLLIN) cc = recvmsg(rcvsock, mhdr, 0); return (cc); |