• Gustavo A. R. Silva's avatar
    smb: client: Fix -Wstringop-overflow issues · f1f047bd
    Gustavo A. R. Silva authored
    pSMB->hdr.Protocol is an array of size 4 bytes, hence when the compiler
    analyzes this line of code
    
    	parm_data = ((char *) &pSMB->hdr.Protocol) + offset;
    
    it legitimately complains about the fact that offset points outside the
    bounds of the array. Notice that the compiler gives priority to the object
    as an array, rather than merely the address of one more byte in a structure
    to wich offset should be added (which seems to be the actual intention of
    the original implementation).
    
    Fix this by explicitly instructing the compiler to treat the code as a
    sequence of bytes in struct smb_com_transaction2_spi_req, and not as an
    array accessed through pointer notation.
    
    Notice that ((char *)pSMB) + sizeof(pSMB->hdr.smb_buf_length) points to
    the same address as ((char *) &pSMB->hdr.Protocol), therefore this results
    in no differences in binary output.
    
    Fixes the following -Wstringop-overflow warnings when built s390
    architecture with defconfig (GCC 13):
      CC [M]  fs/smb/client/cifssmb.o
    In function 'cifs_init_ace',
        inlined from 'posix_acl_to_cifs' at fs/smb/client/cifssmb.c:3046:3,
        inlined from 'cifs_do_set_acl' at fs/smb/client/cifssmb.c:3191:15:
    fs/smb/client/cifssmb.c:2987:31: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
     2987 |         cifs_ace->cifs_e_perm = local_ace->e_perm;
          |         ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
    In file included from fs/smb/client/cifssmb.c:27:
    fs/smb/client/cifspdu.h: In function 'cifs_do_set_acl':
    fs/smb/client/cifspdu.h:384:14: note: at offset [7, 11] into destination object 'Protocol' of size 4
      384 |         __u8 Protocol[4];
          |              ^~~~~~~~
    In function 'cifs_init_ace',
        inlined from 'posix_acl_to_cifs' at fs/smb/client/cifssmb.c:3046:3,
        inlined from 'cifs_do_set_acl' at fs/smb/client/cifssmb.c:3191:15:
    fs/smb/client/cifssmb.c:2988:30: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
     2988 |         cifs_ace->cifs_e_tag =  local_ace->e_tag;
          |         ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
    fs/smb/client/cifspdu.h: In function 'cifs_do_set_acl':
    fs/smb/client/cifspdu.h:384:14: note: at offset [6, 10] into destination object 'Protocol' of size 4
      384 |         __u8 Protocol[4];
          |              ^~~~~~~~
    
    This helps with the ongoing efforts to globally enable
    -Wstringop-overflow.
    
    Link: https://github.com/KSPP/linux/issues/310
    Fixes: dc1af4c4 ("cifs: implement set acl method")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
    Reviewed-by: default avatarKees Cook <keescook@chromium.org>
    Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
    f1f047bd
cifssmb.c 172 KB