• Stephen Rothwell's avatar
    tty: evh_bytechan: Fix out of bounds accesses · 56101005
    Stephen Rothwell authored
    BugLink: https://bugs.launchpad.net/bugs/1875905
    
    commit 3670664b upstream.
    
    ev_byte_channel_send() assumes that its third argument is a 16 byte
    array. Some places where it is called it may not be (or we can't
    easily tell if it is). Newer compilers have started producing warnings
    about this, so make sure we actually pass a 16 byte array.
    
    There may be more elegant solutions to this, but the driver is quite
    old and hasn't been updated in many years.
    
    The warnings (from a powerpc allyesconfig build) are:
    
      In file included from include/linux/byteorder/big_endian.h:5,
                       from arch/powerpc/include/uapi/asm/byteorder.h:14,
                       from include/asm-generic/bitops/le.h:6,
                       from arch/powerpc/include/asm/bitops.h:250,
                       from include/linux/bitops.h:29,
                       from include/linux/kernel.h:12,
                       from include/asm-generic/bug.h:19,
                       from arch/powerpc/include/asm/bug.h:109,
                       from include/linux/bug.h:5,
                       from include/linux/mmdebug.h:5,
                       from include/linux/gfp.h:5,
                       from include/linux/slab.h:15,
                       from drivers/tty/ehv_bytechan.c:24:
      drivers/tty/ehv_bytechan.c: In function ‘ehv_bc_udbg_putc’:
      arch/powerpc/include/asm/epapr_hcalls.h:298:20: warning: array subscript 1 is outside array bounds of ‘const char[1]’ [-Warray-bounds]
        298 |  r6 = be32_to_cpu(p[1]);
      include/uapi/linux/byteorder/big_endian.h:40:51: note: in definition of macro ‘__be32_to_cpu’
         40 | #define __be32_to_cpu(x) ((__force __u32)(__be32)(x))
            |                                                   ^
      arch/powerpc/include/asm/epapr_hcalls.h:298:7: note: in expansion of macro ‘be32_to_cpu’
        298 |  r6 = be32_to_cpu(p[1]);
            |       ^~~~~~~~~~~
      drivers/tty/ehv_bytechan.c:166:13: note: while referencing ‘data’
        166 | static void ehv_bc_udbg_putc(char c)
            |             ^~~~~~~~~~~~~~~~
    
    Fixes: dcd83aaf ("tty/powerpc: introduce the ePAPR embedded hypervisor byte channel driver")
    Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
    Tested-by: default avatarLaurentiu Tudor <laurentiu.tudor@nxp.com>
    [mpe: Trim warnings from change log]
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20200109183912.5fcb52aa@canb.auug.org.auSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarIan May <ian.may@canonical.com>
    Signed-off-by: default avatarKleber Sacilotto de Souza <kleber.souza@canonical.com>
    56101005
ehv_bytechan.c 22.6 KB