lkml.org 
[lkml]   [2011]   [Feb]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 006/176] ALSA: snd-usb-us122l: Fix missing NULL checks
    2.6.36-stable review patch.  If anyone has any objections, please let us know.

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

    From: Karsten Wiese <fzu@wemgehoertderstaat.de>

    commit cdce2db74e156fbd9a2dc3c7b246166f8b70955b upstream.

    Fix missing NULL checks in usb_stream_hwdep_poll() and usb_stream_hwdep_ioctl().
    Wake up poll waiters before returning from usb_stream_hwdep_ioctl().

    Signed-off-by: Karsten Wiese <fzu@wemgehoertderstaat.de>
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    sound/usb/usx2y/us122l.c | 41 ++++++++++++++++++++---------------------
    1 file changed, 20 insertions(+), 21 deletions(-)

    --- a/sound/usb/usx2y/us122l.c
    +++ b/sound/usb/usx2y/us122l.c
    @@ -273,29 +273,26 @@ static unsigned int usb_stream_hwdep_pol
    struct file *file, poll_table *wait)
    {
    struct us122l *us122l = hw->private_data;
    - struct usb_stream *s = us122l->sk.s;
    unsigned *polled;
    unsigned int mask;

    poll_wait(file, &us122l->sk.sleep, wait);

    - switch (s->state) {
    - case usb_stream_ready:
    - if (us122l->first == file)
    - polled = &s->periods_polled;
    - else
    - polled = &us122l->second_periods_polled;
    - if (*polled != s->periods_done) {
    - *polled = s->periods_done;
    - mask = POLLIN | POLLOUT | POLLWRNORM;
    - break;
    + mask = POLLIN | POLLOUT | POLLWRNORM | POLLERR;
    + if (mutex_trylock(&us122l->mutex)) {
    + struct usb_stream *s = us122l->sk.s;
    + if (s && s->state == usb_stream_ready) {
    + if (us122l->first == file)
    + polled = &s->periods_polled;
    + else
    + polled = &us122l->second_periods_polled;
    + if (*polled != s->periods_done) {
    + *polled = s->periods_done;
    + mask = POLLIN | POLLOUT | POLLWRNORM;
    + } else
    + mask = 0;
    }
    - /* Fall through */
    - mask = 0;
    - break;
    - default:
    - mask = POLLIN | POLLOUT | POLLWRNORM | POLLERR;
    - break;
    + mutex_unlock(&us122l->mutex);
    }
    return mask;
    }
    @@ -381,6 +378,7 @@ static int usb_stream_hwdep_ioctl(struct
    {
    struct usb_stream_config *cfg;
    struct us122l *us122l = hw->private_data;
    + struct usb_stream *s;
    unsigned min_period_frames;
    int err = 0;
    bool high_speed;
    @@ -426,18 +424,18 @@ static int usb_stream_hwdep_ioctl(struct
    snd_power_wait(hw->card, SNDRV_CTL_POWER_D0);

    mutex_lock(&us122l->mutex);
    + s = us122l->sk.s;
    if (!us122l->master)
    us122l->master = file;
    else if (us122l->master != file) {
    - if (memcmp(cfg, &us122l->sk.s->cfg, sizeof(*cfg))) {
    + if (!s || memcmp(cfg, &s->cfg, sizeof(*cfg))) {
    err = -EIO;
    goto unlock;
    }
    us122l->slave = file;
    }
    - if (!us122l->sk.s ||
    - memcmp(cfg, &us122l->sk.s->cfg, sizeof(*cfg)) ||
    - us122l->sk.s->state == usb_stream_xrun) {
    + if (!s || memcmp(cfg, &s->cfg, sizeof(*cfg)) ||
    + s->state == usb_stream_xrun) {
    us122l_stop(us122l);
    if (!us122l_start(us122l, cfg->sample_rate, cfg->period_frames))
    err = -EIO;
    @@ -448,6 +446,7 @@ unlock:
    mutex_unlock(&us122l->mutex);
    free:
    kfree(cfg);
    + wake_up_all(&us122l->sk.sleep);
    return err;
    }




    \
     
     \ /
      Last update: 2011-02-16 02:27    [W:4.789 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site