mirror of
				https://github.com/alsa-project/alsa-lib.git
				synced 2025-11-03 09:01:52 -05:00 
			
		
		
		
	Fix missing snd_dlclose() in timer handlers
Call snd_dlclose() properly for the dlopened handlers in timer and timer_query closing functions.
This commit is contained in:
		
							parent
							
								
									34e99ad251
								
							
						
					
					
						commit
						b9c53dd962
					
				
					 3 changed files with 22 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -171,7 +171,14 @@ static int snd_timer_open_conf(snd_timer_t **timer,
 | 
			
		|||
       _err:
 | 
			
		||||
	if (type_conf)
 | 
			
		||||
		snd_config_delete(type_conf);
 | 
			
		||||
	return err >= 0 ? open_func(timer, name, timer_root, timer_conf, mode) : err;
 | 
			
		||||
	if (! err) {
 | 
			
		||||
		err = open_func(timer, name, timer_root, timer_conf, mode);
 | 
			
		||||
		if (err < 0)
 | 
			
		||||
			snd_dlclose(h);
 | 
			
		||||
		else
 | 
			
		||||
			(*timer)->dl_handle = h;
 | 
			
		||||
	}
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int snd_timer_open_noupdate(snd_timer_t **timer, snd_config_t *root, const char *name, int mode)
 | 
			
		||||
| 
						 | 
				
			
			@ -243,6 +250,8 @@ int snd_timer_close(snd_timer_t *timer)
 | 
			
		|||
		snd_async_del_handler(h);
 | 
			
		||||
	}
 | 
			
		||||
	err = timer->ops->close(timer);
 | 
			
		||||
	if (timer->dl_handle)
 | 
			
		||||
		snd_dlclose(timer->dl_handle);
 | 
			
		||||
	free(timer->name);
 | 
			
		||||
	free(timer);
 | 
			
		||||
	return err;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,6 +40,7 @@ typedef struct {
 | 
			
		|||
 | 
			
		||||
struct _snd_timer {
 | 
			
		||||
	unsigned int version;
 | 
			
		||||
	void *dl_handle;
 | 
			
		||||
	char *name;
 | 
			
		||||
	snd_timer_type_t type;
 | 
			
		||||
	int mode;
 | 
			
		||||
| 
						 | 
				
			
			@ -58,6 +59,7 @@ typedef struct {
 | 
			
		|||
} snd_timer_query_ops_t;
 | 
			
		||||
 | 
			
		||||
struct _snd_timer_query {
 | 
			
		||||
	void *dl_handle;
 | 
			
		||||
	char *name;
 | 
			
		||||
	snd_timer_type_t type;
 | 
			
		||||
	int mode;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -129,7 +129,14 @@ static int snd_timer_query_open_conf(snd_timer_query_t **timer,
 | 
			
		|||
       _err:
 | 
			
		||||
	if (type_conf)
 | 
			
		||||
		snd_config_delete(type_conf);
 | 
			
		||||
	return err >= 0 ? open_func(timer, name, timer_root, timer_conf, mode) : err;
 | 
			
		||||
	if (! err) {
 | 
			
		||||
		err = open_func(timer, name, timer_root, timer_conf, mode);
 | 
			
		||||
		if (err < 0)
 | 
			
		||||
			snd_dlclose(h);
 | 
			
		||||
		else
 | 
			
		||||
			(*timer)->dl_handle = h;
 | 
			
		||||
	}
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int snd_timer_query_open_noupdate(snd_timer_query_t **timer, snd_config_t *root, const char *name, int mode)
 | 
			
		||||
| 
						 | 
				
			
			@ -197,6 +204,8 @@ int snd_timer_query_close(snd_timer_query_t *timer)
 | 
			
		|||
	int err;
 | 
			
		||||
  	assert(timer);
 | 
			
		||||
	err = timer->ops->close(timer);
 | 
			
		||||
	if (timer->dl_handle)
 | 
			
		||||
		snd_dlclose(timer->dl_handle);
 | 
			
		||||
	free(timer->name);
 | 
			
		||||
	free(timer);
 | 
			
		||||
	return err;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue