lkml.org 
[lkml]   [2019]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 080/130] ALSA: timer: Limit max amount of slave instances
    Date
    From: Takashi Iwai <tiwai@suse.de>

    [ Upstream commit fdea53fe5de532969a332d6e5e727f2ad8bf084d ]

    The fuzzer tries to open the timer instances as much as possible, and
    this may cause a system hiccup easily. We've already introduced the
    cap for the max number of available instances for the h/w timers, and
    we should put such a limit also to the slave timers, too.

    This patch introduces the limit to the multiple opened slave timers.
    The upper limit is hard-coded to 1000 for now, which should suffice
    for any practical usages up to now.

    Link: https://lore.kernel.org/r/20191106154257.5853-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/core/timer.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    diff --git a/sound/core/timer.c b/sound/core/timer.c
    index c60dfd52e8a6d..22589a073423b 100644
    --- a/sound/core/timer.c
    +++ b/sound/core/timer.c
    @@ -88,6 +88,9 @@ static LIST_HEAD(snd_timer_slave_list);
    /* lock for slave active lists */
    static DEFINE_SPINLOCK(slave_active_lock);

    +#define MAX_SLAVE_INSTANCES 1000
    +static int num_slaves;
    +
    static DEFINE_MUTEX(register_mutex);

    static int snd_timer_free(struct snd_timer *timer);
    @@ -266,6 +269,10 @@ int snd_timer_open(struct snd_timer_instance **ti,
    err = -EINVAL;
    goto unlock;
    }
    + if (num_slaves >= MAX_SLAVE_INSTANCES) {
    + err = -EBUSY;
    + goto unlock;
    + }
    timeri = snd_timer_instance_new(owner, NULL);
    if (!timeri) {
    err = -ENOMEM;
    @@ -275,6 +282,7 @@ int snd_timer_open(struct snd_timer_instance **ti,
    timeri->slave_id = tid->device;
    timeri->flags |= SNDRV_TIMER_IFLG_SLAVE;
    list_add_tail(&timeri->open_list, &snd_timer_slave_list);
    + num_slaves++;
    err = snd_timer_check_slave(timeri);
    if (err < 0) {
    snd_timer_close_locked(timeri, &card_dev_to_put);
    @@ -364,6 +372,8 @@ static int snd_timer_close_locked(struct snd_timer_instance *timeri,
    struct snd_timer_instance *slave, *tmp;

    list_del(&timeri->open_list);
    + if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE)
    + num_slaves--;

    /* force to stop the timer */
    snd_timer_stop(timeri);
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-12-10 23:09    [W:4.104 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site