Skip to content

Commit

Permalink
af_unix: Fix msg_controllen test in scm_pidfd_recv() for MSG_CMSG_COM…
Browse files Browse the repository at this point in the history
…PAT.

[ Upstream commit 718e6b5 ]

Heiko Carstens reported that SCM_PIDFD does not work with MSG_CMSG_COMPAT
because scm_pidfd_recv() always checks msg_controllen against sizeof(struct
cmsghdr).

We need to use sizeof(struct compat_cmsghdr) for the compat case.

Fixes: 5e2ff67 ("scm: add SO_PASSPIDFD and SCM_PIDFD")
Reported-by: Heiko Carstens <hca@linux.ibm.com>
Closes: https://lore.kernel.org/netdev/20230901200517.8742-A-hca@linux.ibm.com/
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Tested-by: Heiko Carstens <hca@linux.ibm.com>
Reviewed-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com>
Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Acked-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
q2ven authored and gregkh committed Sep 19, 2023
1 parent e6b5e47 commit 51bd119
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions include/net/scm.h
Expand Up @@ -9,6 +9,7 @@
#include <linux/pid.h>
#include <linux/nsproxy.h>
#include <linux/sched/signal.h>
#include <net/compat.h>

/* Well, we should have at least one descriptor open
* to accept passed FDs 8)
Expand Down Expand Up @@ -123,14 +124,17 @@ static inline bool scm_has_secdata(struct socket *sock)
static __inline__ void scm_pidfd_recv(struct msghdr *msg, struct scm_cookie *scm)
{
struct file *pidfd_file = NULL;
int pidfd;
int len, pidfd;

/*
* put_cmsg() doesn't return an error if CMSG is truncated,
/* put_cmsg() doesn't return an error if CMSG is truncated,
* that's why we need to opencode these checks here.
*/
if ((msg->msg_controllen <= sizeof(struct cmsghdr)) ||
(msg->msg_controllen - sizeof(struct cmsghdr)) < sizeof(int)) {
if (msg->msg_flags & MSG_CMSG_COMPAT)
len = sizeof(struct compat_cmsghdr) + sizeof(int);
else
len = sizeof(struct cmsghdr) + sizeof(int);

if (msg->msg_controllen < len) {
msg->msg_flags |= MSG_CTRUNC;
return;
}
Expand Down

0 comments on commit 51bd119

Please sign in to comment.