Browse Source

ALSA: seq: Fix leftovers at probe error path

The sequencer core module doesn't call some destructors in the error
path of the init code, which may leave some resources.

This patch mainly fix these leaks by calling the destructors
appropriately at alsa_seq_init().  Also the patch brings a few
cleanups along with it, namely:

- Expand the old "if ((err = xxx) < 0)" coding style
- Get rid of empty seq_queue_init() and its caller
- Change snd_seq_info_done() to void

Last but not least, a couple of functions lose __exit annotation since
they are called also in alsa_seq_init().

No functional changes but minor code cleanups.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 7 years ago
parent
commit
00976ad527

+ 16 - 10
sound/core/seq/seq.c

@@ -84,26 +84,32 @@ static int __init alsa_seq_init(void)
 {
 {
 	int err;
 	int err;
 
 
-	if ((err = client_init_data()) < 0)
-		goto error;
-
-	/* init event queues */
-	if ((err = snd_seq_queues_init()) < 0)
+	err = client_init_data();
+	if (err < 0)
 		goto error;
 		goto error;
 
 
 	/* register sequencer device */
 	/* register sequencer device */
-	if ((err = snd_sequencer_device_init()) < 0)
+	err = snd_sequencer_device_init();
+	if (err < 0)
 		goto error;
 		goto error;
 
 
 	/* register proc interface */
 	/* register proc interface */
-	if ((err = snd_seq_info_init()) < 0)
-		goto error;
+	err = snd_seq_info_init();
+	if (err < 0)
+		goto error_device;
 
 
 	/* register our internal client */
 	/* register our internal client */
-	if ((err = snd_seq_system_client_init()) < 0)
-		goto error;
+	err = snd_seq_system_client_init();
+	if (err < 0)
+		goto error_info;
 
 
 	snd_seq_autoload_init();
 	snd_seq_autoload_init();
+	return 0;
+
+ error_info:
+	snd_seq_info_done();
+ error_device:
+	snd_sequencer_device_done();
  error:
  error:
 	return err;
 	return err;
 }
 }

+ 1 - 1
sound/core/seq/seq_clientmgr.c

@@ -2543,7 +2543,7 @@ int __init snd_sequencer_device_init(void)
 /* 
 /* 
  * unregister sequencer device 
  * unregister sequencer device 
  */
  */
-void __exit snd_sequencer_device_done(void)
+void snd_sequencer_device_done(void)
 {
 {
 	snd_unregister_device(&seq_dev);
 	snd_unregister_device(&seq_dev);
 	put_device(&seq_dev);
 	put_device(&seq_dev);

+ 2 - 8
sound/core/seq/seq_info.c

@@ -50,7 +50,7 @@ create_info_entry(char *name, void (*read)(struct snd_info_entry *,
 	return entry;
 	return entry;
 }
 }
 
 
-static void free_info_entries(void)
+void snd_seq_info_done(void)
 {
 {
 	snd_info_free_entry(queues_entry);
 	snd_info_free_entry(queues_entry);
 	snd_info_free_entry(clients_entry);
 	snd_info_free_entry(clients_entry);
@@ -70,12 +70,6 @@ int __init snd_seq_info_init(void)
 	return 0;
 	return 0;
 
 
  error:
  error:
-	free_info_entries();
+	snd_seq_info_done();
 	return -ENOMEM;
 	return -ENOMEM;
 }
 }
-
-int __exit snd_seq_info_done(void)
-{
-	free_info_entries();
-	return 0;
-}

+ 3 - 3
sound/core/seq/seq_info.h

@@ -30,11 +30,11 @@ void snd_seq_info_queues_read(struct snd_info_entry *entry, struct snd_info_buff
 
 
 
 
 #ifdef CONFIG_SND_PROC_FS
 #ifdef CONFIG_SND_PROC_FS
-int snd_seq_info_init( void );
-int snd_seq_info_done( void );
+int snd_seq_info_init(void);
+void snd_seq_info_done(void);
 #else
 #else
 static inline int snd_seq_info_init(void) { return 0; }
 static inline int snd_seq_info_init(void) { return 0; }
-static inline int snd_seq_info_done(void) { return 0; }
+static inline void snd_seq_info_done(void) {}
 #endif
 #endif
 
 
 #endif
 #endif

+ 1 - 11
sound/core/seq/seq_queue.c

@@ -159,18 +159,8 @@ static void queue_delete(struct snd_seq_queue *q)
 
 
 /*----------------------------------------------------------------*/
 /*----------------------------------------------------------------*/
 
 
-/* setup queues */
-int __init snd_seq_queues_init(void)
-{
-	/*
-	memset(queue_list, 0, sizeof(queue_list));
-	num_queues = 0;
-	*/
-	return 0;
-}
-
 /* delete all existing queues */
 /* delete all existing queues */
-void __exit snd_seq_queues_delete(void)
+void snd_seq_queues_delete(void)
 {
 {
 	int i;
 	int i;
 
 

+ 0 - 3
sound/core/seq/seq_queue.h

@@ -63,9 +63,6 @@ struct snd_seq_queue {
 /* get the number of current queues */
 /* get the number of current queues */
 int snd_seq_queue_get_cur_queues(void);
 int snd_seq_queue_get_cur_queues(void);
 
 
-/* init queues structure */
-int snd_seq_queues_init(void);
-
 /* delete queues */ 
 /* delete queues */ 
 void snd_seq_queues_delete(void);
 void snd_seq_queues_delete(void);