af_unix: Fix msg_controllen test in scm_pidfd_recv() for MSG_CMSG_COMPAT.
[platform/kernel/linux-rpi.git] / include / net / scm.h
index c5bcdf6..e8c76b4 100644 (file)
@@ -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)
@@ -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;
        }