• T
    ALSA: timer: Improve user queue reallocation · 890e2cb5
    Takashi Iwai 提交于
    ALSA timer may reallocate the user queue upon request, and it happens
    at three places for now: at opening, at SNDRV_TIMER_IOCTL_PARAMS, and
    at SNDRV_TIMER_IOCTL_SELECT.  However, the last one,
    snd_timer_user_tselect(), doesn't need to reallocate the buffer since
    it doesn't change the queue size.  It does just because tu->tread
    might have been changed before starting the timer.
    
    Instead of *_SELECT ioctl, we should reallocate the queue at
    SNDRV_TIMER_IOCTL_TREAD; then the timer is guaranteed to be stopped,
    thus we can reassign the buffer more safely.
    
    This patch implements that with a slight code refactoring.
    Essentially, the patch achieves:
    - Introduce realloc_user_queue() for (re-)allocating the ring buffer,
      and call it from all places.  Also, realloc_user_queue() uses
      kcalloc() for avoiding possible leaks.
    - Add the buffer reallocation at SNDRV_TIMER_IOCTL_TREAD.  When it
      fails, tu->tread is restored to the old value, too.
    - Drop the buffer reallocation at snd_timer_user_tselect().
    Tested-by: NAlexander Potapenko <glider@google.com>
    Signed-off-by: NTakashi Iwai <tiwai@suse.de>
    890e2cb5
timer.c 53.4 KB