| From 109ebf35fca718de41ba1635c072a33973b00c05 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 28 Aug 2018 12:49:43 +0200 |
| Subject: ALSA: seq: Do error checks at creating system ports |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| [ Upstream commit b8e131542b47b81236ecf6768c923128e1f5db6e ] |
| |
| snd_seq_system_client_init() doesn't check the errors returned from |
| its port creations. Let's do it properly and handle the error paths. |
| |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/core/seq/seq_system.c | 18 +++++++++++++++--- |
| 1 file changed, 15 insertions(+), 3 deletions(-) |
| |
| diff --git a/sound/core/seq/seq_system.c b/sound/core/seq/seq_system.c |
| index 8ce1d0b40dce1..ce1f1e4727ab1 100644 |
| --- a/sound/core/seq/seq_system.c |
| +++ b/sound/core/seq/seq_system.c |
| @@ -123,6 +123,7 @@ int __init snd_seq_system_client_init(void) |
| { |
| struct snd_seq_port_callback pcallbacks; |
| struct snd_seq_port_info *port; |
| + int err; |
| |
| port = kzalloc(sizeof(*port), GFP_KERNEL); |
| if (!port) |
| @@ -144,7 +145,10 @@ int __init snd_seq_system_client_init(void) |
| port->flags = SNDRV_SEQ_PORT_FLG_GIVEN_PORT; |
| port->addr.client = sysclient; |
| port->addr.port = SNDRV_SEQ_PORT_SYSTEM_TIMER; |
| - snd_seq_kernel_client_ctl(sysclient, SNDRV_SEQ_IOCTL_CREATE_PORT, port); |
| + err = snd_seq_kernel_client_ctl(sysclient, SNDRV_SEQ_IOCTL_CREATE_PORT, |
| + port); |
| + if (err < 0) |
| + goto error_port; |
| |
| /* register announcement port */ |
| strcpy(port->name, "Announce"); |
| @@ -154,16 +158,24 @@ int __init snd_seq_system_client_init(void) |
| port->flags = SNDRV_SEQ_PORT_FLG_GIVEN_PORT; |
| port->addr.client = sysclient; |
| port->addr.port = SNDRV_SEQ_PORT_SYSTEM_ANNOUNCE; |
| - snd_seq_kernel_client_ctl(sysclient, SNDRV_SEQ_IOCTL_CREATE_PORT, port); |
| + err = snd_seq_kernel_client_ctl(sysclient, SNDRV_SEQ_IOCTL_CREATE_PORT, |
| + port); |
| + if (err < 0) |
| + goto error_port; |
| announce_port = port->addr.port; |
| |
| kfree(port); |
| return 0; |
| + |
| + error_port: |
| + snd_seq_system_client_done(); |
| + kfree(port); |
| + return err; |
| } |
| |
| |
| /* unregister our internal client */ |
| -void __exit snd_seq_system_client_done(void) |
| +void snd_seq_system_client_done(void) |
| { |
| int oldsysclient = sysclient; |
| |
| -- |
| 2.20.1 |
| |