summaryrefslogtreecommitdiff
path: root/src/basic
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2020-04-23 09:40:03 +0200
committerLennart Poettering <lennart@poettering.net>2020-04-23 09:41:47 +0200
commit3691bcf3c5eebdcca5b4f1c51c745441c57a6cd1 (patch)
treecaff7067ab4c3b4c5871c1869ed4e806c65f512d /src/basic
parent47eae6ce0c28b1984f8f5ec4c2f7bc428cf3b6ad (diff)
downloadsystemd-3691bcf3c5eebdcca5b4f1c51c745441c57a6cd1.tar.gz
tree-wide: use recvmsg_safe() at various places
Let's be extra careful whenever we return from recvmsg() and see MSG_CTRUNC set. This generally means we ran into a programming error, as we didn't size the control buffer large enough. It's an error condition we should at least log about, or propagate up. Hence do that. This is particularly important when receiving fds, since for those the control data can be of any size. In particular on stream sockets that's nasty, because if we miss an fd because of control data truncation we cannot recover, we might not even realize that we are one off. (Also, when failing early, if there's any chance the socket might be AF_UNIX let's close all received fds, all the time. We got this right most of the time, but there were a few cases missing. God, UNIX is hard to use)
Diffstat (limited to 'src/basic')
-rw-r--r--src/basic/socket-util.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c
index 2d0564e66f..b797a52180 100644
--- a/src/basic/socket-util.c
+++ b/src/basic/socket-util.c
@@ -901,9 +901,9 @@ ssize_t receive_one_fd_iov(
* combination with send_one_fd().
*/
- k = recvmsg(transport_fd, &mh, MSG_CMSG_CLOEXEC | flags);
+ k = recvmsg_safe(transport_fd, &mh, MSG_CMSG_CLOEXEC | flags);
if (k < 0)
- return (ssize_t) -errno;
+ return k;
CMSG_FOREACH(cmsg, &mh) {
if (cmsg->cmsg_level == SOL_SOCKET &&
@@ -915,12 +915,13 @@ ssize_t receive_one_fd_iov(
}
}
- if (!found)
+ if (!found) {
cmsg_close_all(&mh);
- /* If didn't receive an FD or any data, return an error. */
- if (k == 0 && !found)
- return -EIO;
+ /* If didn't receive an FD or any data, return an error. */
+ if (k == 0)
+ return -EIO;
+ }
if (found)
*ret_fd = *(int*) CMSG_DATA(found);