lkml.org 
[lkml]   [2017]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 103/104] [media] ttpci: address stringop overflow warning
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Arnd Bergmann <arnd@arndb.de>

    commit 69d3973af1acd4c0989ec8218c05f12d303cd7cf upstream.

    gcc-7.0.1 warns about old code in ttpci:

    In file included from drivers/media/pci/ttpci/av7110.c:63:0:
    In function 'irdebi.isra.2',
    inlined from 'start_debi_dma' at drivers/media/pci/ttpci/av7110.c:376:3,
    inlined from 'gpioirq' at drivers/media/pci/ttpci/av7110.c:659:3:
    drivers/media/pci/ttpci/av7110_hw.h:406:3: warning: 'memcpy': specified size between 18446744071562067968 and 18446744073709551615 exceeds maximum object size 9223372036854775807 [-Wstringop-overflow=]
    memcpy(av7110->debi_virt, (char *) &res, count);
    In function 'irdebi.isra.2',
    inlined from 'start_debi_dma' at drivers/media/pci/ttpci/av7110.c:376:3,
    inlined from 'gpioirq' at drivers/media/pci/ttpci/av7110.c:668:3:
    drivers/media/pci/ttpci/av7110_hw.h:406:3: warning: 'memcpy': specified size between 18446744071562067968 and 18446744073709551615 exceeds maximum object size 9223372036854775807 [-Wstringop-overflow=]
    memcpy(av7110->debi_virt, (char *) &res, count);

    Apparently, 'count' can be negative here, which will then get turned
    into a giant size argument for memcpy. Changing the sizes to 'unsigned
    int' instead seems safe as we already check for maximum sizes, and it
    also simplifies the code a bit.

    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/media/pci/ttpci/av7110_hw.c | 8 ++++----
    drivers/media/pci/ttpci/av7110_hw.h | 12 ++++++------
    2 files changed, 10 insertions(+), 10 deletions(-)

    --- a/drivers/media/pci/ttpci/av7110_hw.c
    +++ b/drivers/media/pci/ttpci/av7110_hw.c
    @@ -56,11 +56,11 @@
    by Nathan Laredo <laredo@gnu.org> */

    int av7110_debiwrite(struct av7110 *av7110, u32 config,
    - int addr, u32 val, int count)
    + int addr, u32 val, unsigned int count)
    {
    struct saa7146_dev *dev = av7110->dev;

    - if (count <= 0 || count > 32764) {
    + if (count > 32764) {
    printk("%s: invalid count %d\n", __func__, count);
    return -1;
    }
    @@ -78,12 +78,12 @@ int av7110_debiwrite(struct av7110 *av71
    return 0;
    }

    -u32 av7110_debiread(struct av7110 *av7110, u32 config, int addr, int count)
    +u32 av7110_debiread(struct av7110 *av7110, u32 config, int addr, unsigned int count)
    {
    struct saa7146_dev *dev = av7110->dev;
    u32 result = 0;

    - if (count > 32764 || count <= 0) {
    + if (count > 32764) {
    printk("%s: invalid count %d\n", __func__, count);
    return 0;
    }
    --- a/drivers/media/pci/ttpci/av7110_hw.h
    +++ b/drivers/media/pci/ttpci/av7110_hw.h
    @@ -377,14 +377,14 @@ extern int av7110_fw_request(struct av71

    /* DEBI (saa7146 data extension bus interface) access */
    extern int av7110_debiwrite(struct av7110 *av7110, u32 config,
    - int addr, u32 val, int count);
    + int addr, u32 val, unsigned int count);
    extern u32 av7110_debiread(struct av7110 *av7110, u32 config,
    - int addr, int count);
    + int addr, unsigned int count);


    /* DEBI during interrupt */
    /* single word writes */
    -static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
    +static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val, unsigned int count)
    {
    av7110_debiwrite(av7110, config, addr, val, count);
    }
    @@ -397,7 +397,7 @@ static inline void mwdebi(struct av7110
    av7110_debiwrite(av7110, config, addr, 0, count);
    }

    -static inline u32 irdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
    +static inline u32 irdebi(struct av7110 *av7110, u32 config, int addr, u32 val, unsigned int count)
    {
    u32 res;

    @@ -408,7 +408,7 @@ static inline u32 irdebi(struct av7110 *
    }

    /* DEBI outside interrupts, only for count <= 4! */
    -static inline void wdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
    +static inline void wdebi(struct av7110 *av7110, u32 config, int addr, u32 val, unsigned int count)
    {
    unsigned long flags;

    @@ -417,7 +417,7 @@ static inline void wdebi(struct av7110 *
    spin_unlock_irqrestore(&av7110->debilock, flags);
    }

    -static inline u32 rdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
    +static inline u32 rdebi(struct av7110 *av7110, u32 config, int addr, u32 val, unsigned int count)
    {
    unsigned long flags;
    u32 res;

    \
     
     \ /
      Last update: 2017-10-06 11:12    [W:5.290 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site