[alsa-devel] SEGFault when optininal snd_ctl_ext_callback::read_event() not set

Takashi Iwai tiwai at suse.de
Thu Oct 5 16:44:55 CEST 2017


On Thu, 05 Oct 2017 16:28:33 +0200,
Wischer, Timo (ADITG/ESB) wrote:
> 
> Hi Takashi,
> 
> see attached the patch.
> >From my opinion failing with an error is the best solution (see explanation in the commit message)

Fair enough, applied now.
Thanks.


Takashi


> 
> 
> Best regards
> 
> Timo Wischer
> 
> Advanced Driver Information Technology GmbH
> Engineering Software Base (ADITG/ESB)
> Robert-Bosch-Str. 200
> 31139 Hildesheim
> Germany
> 
> Tel. +49 5121 49 6938
> Fax +49 5121 49 6999
> twischer at de.adit-jv.com
> 
> ADIT is a joint venture company of Robert Bosch GmbH/Robert Bosch Car Multimedia GmbH and DENSO Corporation
> Sitz: Hildesheim, Registergericht: Amtsgericht Hildesheim HRB 3438
> Geschäftsführung: Wilhelm Grabow, Ken Yaguchi
> 
> ________________________________________
> From: Takashi Iwai [tiwai at suse.de]
> Sent: Thursday, October 05, 2017 3:17 PM
> To: Wischer, Timo (ADITG/ESB)
> Cc: alsa-devel at alsa-project.org
> Subject: Re: [alsa-devel] SEGFault when optininal       snd_ctl_ext_callback::read_event() not set
> 
> On Thu, 05 Oct 2017 14:03:14 +0200,
> Wischer, Timo (ADITG/ESB) wrote:
> >
> > Hi all,
> >
> > snd_ctl_ext_callback::read_event() callback is mentioned as optional
> > (see http://git.alsa-project.org/?p=alsa-lib.git;a=blob;f=include/control_external.h;h=12958e70a5230de9c74029c641a395a2073c8646;hb=refs/heads/master#l239)
> >
> > but there is no NULL check and the NULL pointer will be called if the read_event function callback pointer is not set.
> > (see http://git.alsa-project.org/?p=alsa-lib.git;a=blob;f=src/control/control_ext.c;h=56552fa1aa0ef0e6383abf4029b63944a841c2c4;hb=refs/heads/master#l419)
> >
> > I think a default function has to be provided which will be called when the callback is not set or the read_event() callback should not be marked as optional.
> >
> > What is your opinion?
> 
> It should have a NULL check there, as documentation clearly states
> that it's optional.
> 
> Care to submit a fix patch?
> 
> 
> thanks,
> 
> Takashi
> From 8cc3dbc6fad0a4de82ab4b5c95a86499c99d56d8 Mon Sep 17 00:00:00 2001
> From: Timo Wischer <twischer at de.adit-jv.com>
> Date: Thu, 5 Oct 2017 16:25:23 +0200
> Subject: ctl: ext: Fail with error code if snd_ctl_ext_callback::read_event()
>  callback is not defined
> 
> The snd_ctl_ext_callback::read_event() callback is only optional
> if no poll descriptor was given via
> snd_ctl_ext_t::poll_fd
> or
> snd_ctl_ext_callback::snd_ctl_ext_poll_descriptors().
> 
> If a poll descriptor is given the
> snd_ctl_ext_callback::read_event()
> callback has also to be defined
> because there is no minigful default behavior.
> 
> This callback will be called when ever the poll() on
> the file descriptor indicates that there is an event pending.
> Therefore returning a 0 which indicates that there is no event makes no
> sense.
> 
> Signed-off-by: Timo Wischer <twischer at de.adit-jv.com>
> 
> diff --git a/src/control/control_ext.c b/src/control/control_ext.c
> index 56552fa..d7de8e8 100644
> --- a/src/control/control_ext.c
> +++ b/src/control/control_ext.c
> @@ -415,8 +415,12 @@ static int snd_ctl_ext_read(snd_ctl_t *handle, snd_ctl_event_t *event)
>  {
>  	snd_ctl_ext_t *ext = handle->private_data;
>  
> -	memset(event, 0, sizeof(*event));
> -	return ext->callback->read_event(ext, &event->data.elem.id, &event->data.elem.mask);
> +	if (ext->callback->read_event) {
> +		memset(event, 0, sizeof(*event));
> +		return ext->callback->read_event(ext, &event->data.elem.id, &event->data.elem.mask);
> +	}
> +
> +	return -EINVAL;
>  }
>  
>  static int snd_ctl_ext_poll_descriptors_count(snd_ctl_t *handle)


More information about the Alsa-devel mailing list