]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
socket-util: add recvmsg_safe() wrapper that handles MSG_CTRUNC
authorLennart Poettering <lennart@poettering.net>
Fri, 17 Apr 2020 20:26:14 +0000 (22:26 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 23 Apr 2020 07:40:56 +0000 (09:40 +0200)
src/basic/socket-util.c
src/basic/socket-util.h

index ad467ab85119a8cf6cdeef12362e52672f483560..2d0564e66f04623cd06838e6ad4ac4ded640ae11 100644 (file)
@@ -1171,3 +1171,24 @@ int socket_bind_to_ifindex(int fd, int ifindex) {
 
         return socket_bind_to_ifname(fd, ifname);
 }
+
+ssize_t recvmsg_safe(int sockfd, struct msghdr *msg, int flags) {
+        ssize_t n;
+
+        /* A wrapper around recvmsg() that checks for MSG_CTRUNC, and turns it into an error, in a reasonably
+         * safe way, closing any SCM_RIGHTS fds in the error path.
+         *
+         * Note that unlike our usual coding style this might modify *msg on failure. */
+
+        n = recvmsg(sockfd, msg, flags);
+        if (n < 0)
+                return -errno;
+
+        if (FLAGS_SET(msg->msg_flags, MSG_CTRUNC)) {
+                cmsg_close_all(msg);
+                return -EXFULL; /* a recognizable error code */
+        }
+
+        return n;
+
+}
index 24e12139516e121d6fd5aeb2a2d0d67de3ed5afb..95643135df7cbca6db0b3e734c94eaf9680e41f6 100644 (file)
@@ -199,3 +199,5 @@ static inline int setsockopt_int(int fd, int level, int optname, int value) {
 
 int socket_bind_to_ifname(int fd, const char *ifname);
 int socket_bind_to_ifindex(int fd, int ifindex);
+
+ssize_t recvmsg_safe(int sockfd, struct msghdr *msg, int flags);