lkml.org 
[lkml]   [2012]   [Mar]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[34-longterm 006/196] ALSA: Fix yet another race in disconnection
    Date
    From: Takashi Iwai <tiwai@suse.de>

    -------------------
    This is a commit scheduled for the next v2.6.34 longterm release.
    If you see a problem with using this for longterm, please comment.
    -------------------

    commit a45e3d6b13e97506b616980c0f122c3389bcefa4 upstream.

    This patch fixes a race between snd_card_file_remove() and
    snd_card_disconnect(). When the card is added to shutdown_files list
    in snd_card_disconnect(), but it's freed in snd_card_file_remove() at
    the same time, the shutdown_files list gets corrupted. The list member
    must be freed in snd_card_file_remove() as well.

    Reported-and-tested-by: Russ Dill <russ.dill@gmail.com>
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
    ---
    sound/core/init.c | 4 ++++
    1 file changed, 4 insertions(+)

    diff --git a/sound/core/init.c b/sound/core/init.c
    index ec4a50c..82f350e 100644
    --- a/sound/core/init.c
    +++ b/sound/core/init.c
    @@ -848,6 +848,7 @@ int snd_card_file_add(struct snd_card *card, struct file *file)
    return -ENOMEM;
    mfile->file = file;
    mfile->disconnected_f_op = NULL;
    + INIT_LIST_HEAD(&mfile->shutdown_list);
    spin_lock(&card->files_lock);
    if (card->shutdown) {
    spin_unlock(&card->files_lock);
    @@ -883,6 +884,9 @@ int snd_card_file_remove(struct snd_card *card, struct file *file)
    list_for_each_entry(mfile, &card->files_list, list) {
    if (mfile->file == file) {
    list_del(&mfile->list);
    + spin_lock(&shutdown_lock);
    + list_del(&mfile->shutdown_list);
    + spin_unlock(&shutdown_lock);
    if (mfile->disconnected_f_op)
    fops_put(mfile->disconnected_f_op);
    found = mfile;
    --
    1.7.9.3


    \
     
     \ /
      Last update: 2012-03-13 02:11    [W:3.924 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site