From d6024cb3c1074fafb5c54d1c6cdbdf08181a9419 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Fri, 30 Aug 2024 23:47:48 +0200 Subject: [PATCH] fd-util: also close pidfd from SCM_PIDFD in cmsg_close_all() --- src/basic/fd-util.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c index 5d7fc258b2..88b76c51d0 100644 --- a/src/basic/fd-util.c +++ b/src/basic/fd-util.c @@ -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) { -- 2.25.1