fd-util: also close pidfd from SCM_PIDFD in cmsg_close_all()
authorMike Yuan <me@yhndnzj.com>
Fri, 30 Aug 2024 21:47:48 +0000 (23:47 +0200)
committerMike Yuan <me@yhndnzj.com>
Wed, 4 Sep 2024 16:50:54 +0000 (18:50 +0200)
src/basic/fd-util.c

index 5d7fc258b2f906b5613bb5b2567d4ad507d4c305..88b76c51d0baa421ead06706cd2d4032d96a632b 100644 (file)
@@ -568,14 +568,21 @@ int same_fd(int a, int b) {
 }
 
 void cmsg_close_all(struct msghdr *mh) {
-        struct cmsghdr *cmsg;
-
         assert(mh);
 
-        CMSG_FOREACH(cmsg, mh)
-                if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS)
+        struct cmsghdr *cmsg;
+        CMSG_FOREACH(cmsg, mh) {
+                if (cmsg->cmsg_level != SOL_SOCKET)
+                        continue;
+
+                if (cmsg->cmsg_type == SCM_RIGHTS)
                         close_many(CMSG_TYPED_DATA(cmsg, int),
                                    (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int));
+                else if (cmsg->cmsg_type == SCM_PIDFD) {
+                        assert(cmsg->cmsg_len == CMSG_LEN(sizeof(int)));
+                        safe_close(*CMSG_TYPED_DATA(cmsg, int));
+                }
+        }
 }
 
 bool fdname_is_valid(const char *s) {