af_unix: Silence randstruct GCC plugin warning
authorKees Cook <keescook@chromium.org>
Tue, 10 May 2022 22:46:26 +0000 (15:46 -0700)
committerKees Cook <keescook@chromium.org>
Mon, 16 May 2022 23:02:21 +0000 (16:02 -0700)
While preparing for Clang randstruct support (which duplicated many of
the warnings the randstruct GCC plugin warned about), one strange one
remained only for the randstruct GCC plugin. Eliminating this rids
the plugin of the last exception.

It seems the plugin is happy to dereference individual members of
a cross-struct cast, but it is upset about casting to a whole object
pointer. This only manifests in one place in the kernel, so just replace
the variable with individual member accesses. There is no change in
executable instruction output.

Drop the last exception from the randstruct GCC plugin.

Cc: "David S. Miller" <davem@davemloft.net>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Paolo Abeni <pabeni@redhat.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Cong Wang <cong.wang@bytedance.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: netdev@vger.kernel.org
Cc: linux-hardening@vger.kernel.org
Acked-by: Kuniyuki Iwashima <kuniyu@amazon.co.jp>
Link: https://lore.kernel.org/lkml/20220511022217.58586-1-kuniyu@amazon.co.jp
Acked-by: Jakub Kicinski <kuba@kernel.org>
Link: https://lore.kernel.org/lkml/20220511151542.4cb3ff17@kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>
net/unix/af_unix.c
scripts/gcc-plugins/randomize_layout_plugin.c

index e71a312faa1e2ef856c027e1f55f4b79a34246ae..36367e7e3e0a9c5dbdafc1aea2c9d385b8934934 100644 (file)
@@ -1808,11 +1808,9 @@ static int maybe_init_creds(struct scm_cookie *scm,
 static bool unix_skb_scm_eq(struct sk_buff *skb,
                            struct scm_cookie *scm)
 {
-       const struct unix_skb_parms *u = &UNIXCB(skb);
-
-       return u->pid == scm->pid &&
-              uid_eq(u->uid, scm->creds.uid) &&
-              gid_eq(u->gid, scm->creds.gid) &&
+       return UNIXCB(skb).pid == scm->pid &&
+              uid_eq(UNIXCB(skb).uid, scm->creds.uid) &&
+              gid_eq(UNIXCB(skb).gid, scm->creds.gid) &&
               unix_secdata_eq(scm, skb);
 }
 
index c9d345a91c41e29dd6544088cbb40209a87582ef..2ca768d88a68beb1e31e0b54a5796e4adb88c72f 100644 (file)
@@ -46,8 +46,6 @@ struct whitelist_entry {
 };
 
 static const struct whitelist_entry whitelist[] = {
-       /* unix_skb_parms via UNIXCB() buffer */
-       { "net/unix/af_unix.c", "unix_skb_parms", "char" },
        { }
 };