lkml.org 
[lkml]   [2021]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 395/530] ALSA: usb-audio: Add error checks for usb_driver_claim_interface() calls
    Date
    From: Takashi Iwai <tiwai@suse.de>

    [ Upstream commit 5fb45414ae03421255593fd5556aa2d1d82303aa ]

    There are a few calls of usb_driver_claim_interface() but all of those
    miss the proper error checks, as reported by Coverity. This patch
    adds those missing checks.

    Along with it, replace the magic pointer with -1 with a constant
    USB_AUDIO_IFACE_UNUSED for better readability.

    Reported-by: coverity-bot <keescook+coverity-bot@chromium.org>
    Addresses-Coverity-ID: 1475943 ("Error handling issues")
    Addresses-Coverity-ID: 1475944 ("Error handling issues")
    Addresses-Coverity-ID: 1475945 ("Error handling issues")
    Fixes: b1ce7ba619d9 ("ALSA: usb-audio: claim autodetected PCM interfaces all at once")
    Fixes: e5779998bf8b ("ALSA: usb-audio: refactor code")
    Link: https://lore.kernel.org/r/202104051059.FB7F3016@keescook
    Link: https://lore.kernel.org/r/20210406113534.30455-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/usb/card.c | 14 +++++++-------
    sound/usb/quirks.c | 16 ++++++++++++----
    sound/usb/usbaudio.h | 2 ++
    3 files changed, 21 insertions(+), 11 deletions(-)

    diff --git a/sound/usb/card.c b/sound/usb/card.c
    index fc7c359ae215..258b81b39917 100644
    --- a/sound/usb/card.c
    +++ b/sound/usb/card.c
    @@ -182,9 +182,8 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int
    ctrlif, interface);
    return -EINVAL;
    }
    - usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L);
    -
    - return 0;
    + return usb_driver_claim_interface(&usb_audio_driver, iface,
    + USB_AUDIO_IFACE_UNUSED);
    }

    if ((altsd->bInterfaceClass != USB_CLASS_AUDIO &&
    @@ -204,7 +203,8 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int

    if (! snd_usb_parse_audio_interface(chip, interface)) {
    usb_set_interface(dev, interface, 0); /* reset the current interface */
    - usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L);
    + return usb_driver_claim_interface(&usb_audio_driver, iface,
    + USB_AUDIO_IFACE_UNUSED);
    }

    return 0;
    @@ -864,7 +864,7 @@ static void usb_audio_disconnect(struct usb_interface *intf)
    struct snd_card *card;
    struct list_head *p;

    - if (chip == (void *)-1L)
    + if (chip == USB_AUDIO_IFACE_UNUSED)
    return;

    card = chip->card;
    @@ -993,7 +993,7 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
    struct usb_mixer_interface *mixer;
    struct list_head *p;

    - if (chip == (void *)-1L)
    + if (chip == USB_AUDIO_IFACE_UNUSED)
    return 0;

    if (!chip->num_suspended_intf++) {
    @@ -1024,7 +1024,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
    struct list_head *p;
    int err = 0;

    - if (chip == (void *)-1L)
    + if (chip == USB_AUDIO_IFACE_UNUSED)
    return 0;

    atomic_inc(&chip->active); /* avoid autopm */
    diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
    index 5ab2a4580bfb..bddef8ad5778 100644
    --- a/sound/usb/quirks.c
    +++ b/sound/usb/quirks.c
    @@ -55,8 +55,12 @@ static int create_composite_quirk(struct snd_usb_audio *chip,
    if (!iface)
    continue;
    if (quirk->ifnum != probed_ifnum &&
    - !usb_interface_claimed(iface))
    - usb_driver_claim_interface(driver, iface, (void *)-1L);
    + !usb_interface_claimed(iface)) {
    + err = usb_driver_claim_interface(driver, iface,
    + USB_AUDIO_IFACE_UNUSED);
    + if (err < 0)
    + return err;
    + }
    }

    return 0;
    @@ -390,8 +394,12 @@ static int create_autodetect_quirks(struct snd_usb_audio *chip,
    continue;

    err = create_autodetect_quirk(chip, iface, driver);
    - if (err >= 0)
    - usb_driver_claim_interface(driver, iface, (void *)-1L);
    + if (err >= 0) {
    + err = usb_driver_claim_interface(driver, iface,
    + USB_AUDIO_IFACE_UNUSED);
    + if (err < 0)
    + return err;
    + }
    }

    return 0;
    diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
    index 9667060ff92b..e54a98f46549 100644
    --- a/sound/usb/usbaudio.h
    +++ b/sound/usb/usbaudio.h
    @@ -63,6 +63,8 @@ struct snd_usb_audio {
    struct media_intf_devnode *ctl_intf_media_devnode;
    };

    +#define USB_AUDIO_IFACE_UNUSED ((void *)-1L)
    +
    #define usb_audio_err(chip, fmt, args...) \
    dev_err(&(chip)->dev->dev, fmt, ##args)
    #define usb_audio_warn(chip, fmt, args...) \
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-05-12 19:01    [W:3.824 / U:0.780 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site