In preparation for FORTIFY_SOURCE performing compile-time and run-time
field bounds checking for memset(), avoid intentionally writing across
neighboring fields.

Add struct_group() to mark the region of struct iucv_sock that gets
initialized to zero. Avoid the future warning:

In function 'fortify_memset_chk',
    inlined from 'iucv_sock_alloc' at net/iucv/af_iucv.c:476:2:
./include/linux/fortify-string.h:199:4: warning: call to 
'__write_overflow_field' declared with attribute warning: detected write beyond 
size of field (1st parameter); maybe use struct_group()? [-Wattribute-warning]
  199 |    __write_overflow_field(p_size_field, size);
      |    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Cc: Julian Wiedmann <j...@linux.ibm.com>
Cc: Karsten Graul <kgr...@linux.ibm.com>
Cc: "David S. Miller" <da...@davemloft.net>
Cc: Jakub Kicinski <k...@kernel.org>
Cc: linux-s...@vger.kernel.org
Cc: net...@vger.kernel.org
Signed-off-by: Kees Cook <keesc...@chromium.org>
---
 include/net/iucv/af_iucv.h | 10 ++++++----
 net/iucv/af_iucv.c         |  2 +-
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/include/net/iucv/af_iucv.h b/include/net/iucv/af_iucv.h
index ff06246dbbb9..df85d19fbf84 100644
--- a/include/net/iucv/af_iucv.h
+++ b/include/net/iucv/af_iucv.h
@@ -112,10 +112,12 @@ enum iucv_tx_notify {
 
 struct iucv_sock {
        struct sock             sk;
-       char                    src_user_id[8];
-       char                    src_name[8];
-       char                    dst_user_id[8];
-       char                    dst_name[8];
+       struct_group(init,
+               char            src_user_id[8];
+               char            src_name[8];
+               char            dst_user_id[8];
+               char            dst_name[8];
+       );
        struct list_head        accept_q;
        spinlock_t              accept_q_lock;
        struct sock             *parent;
diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c
index 18316ee3c692..9446e2771d31 100644
--- a/net/iucv/af_iucv.c
+++ b/net/iucv/af_iucv.c
@@ -473,7 +473,7 @@ static struct sock *iucv_sock_alloc(struct socket *sock, 
int proto, gfp_t prio,
        atomic_set(&iucv->msg_recv, 0);
        iucv->path = NULL;
        iucv->sk_txnotify = afiucv_hs_callback_txnotify;
-       memset(&iucv->src_user_id , 0, 32);
+       memset(&iucv->init, 0, sizeof(iucv->init));
        if (pr_iucv)
                iucv->transport = AF_IUCV_TRANS_IUCV;
        else
-- 
2.30.2

Reply via email to