• Takashi Iwai's avatar
    ALSA: timer: Fix incorrectly assigned timer instance · e7af6307
    Takashi Iwai authored
    The clean up commit 41672c0c ("ALSA: timer: Simplify error path in
    snd_timer_open()") unified the error handling code paths with the
    standard goto, but it introduced a subtle bug: the timer instance is
    stored in snd_timer_open() incorrectly even if it returns an error.
    This may eventually lead to UAF, as spotted by fuzzer.
    
    The culprit is the snd_timer_open() code checks the
    SNDRV_TIMER_IFLG_EXCLUSIVE flag with the common variable timeri.
    This variable is supposed to be the newly created instance, but we
    (ab-)used it for a temporary check before the actual creation of a
    timer instance.  After that point, there is another check for the max
    number of instances, and it bails out if over the threshold.  Before
    the refactoring above, it worked fine because the code returned
    directly from that point.  After the refactoring, however, it jumps to
    the unified error path that stores the timeri variable in return --
    even if it returns an error.  Unfortunately this stored value is kept
    in the caller side (snd_timer_user_tselect()) in tu->timeri.  This
    causes inconsistency later, as if the timer was successfully
    assigned.
    
    In this patch, we fix it by not re-using timeri variable but a
    temporary variable for testing the exclusive connection, so timeri
    remains NULL at that point.
    
    Fixes: 41672c0c ("ALSA: timer: Simplify error path in snd_timer_open()")
    Reported-and-tested-by: default avatarTristan Madani <tristmd@gmail.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20191106165547.23518-1-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    e7af6307
timer.c 55 KB