From: Takashi Iwai <tiwai@suse.de>
To: alsa-devel@alsa-project.org
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH 20/36] ALSA: seq: Check the conflicting port at port creation
Date: Fri, 19 May 2023 11:30:58 +0200 [thread overview]
Message-ID: <20230519093114.28813-21-tiwai@suse.de> (raw)
In-Reply-To: <20230519093114.28813-1-tiwai@suse.de>
We didn't check if a port with the given port number has been already
present at creating a new port. Check it and return -EBUSY properly
if the port number conflicts.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
sound/core/seq/seq_clientmgr.c | 12 ++++++++----
sound/core/seq/seq_ports.c | 24 ++++++++++++++++--------
sound/core/seq/seq_ports.h | 5 +++--
3 files changed, 27 insertions(+), 14 deletions(-)
diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c
index 019af1343325..06743114cabf 100644
--- a/sound/core/seq/seq_clientmgr.c
+++ b/sound/core/seq/seq_clientmgr.c
@@ -1194,15 +1194,19 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, void *arg)
struct snd_seq_port_info *info = arg;
struct snd_seq_client_port *port;
struct snd_seq_port_callback *callback;
- int port_idx;
+ int port_idx, err;
/* it is not allowed to create the port for an another client */
if (info->addr.client != client->number)
return -EPERM;
- port = snd_seq_create_port(client, (info->flags & SNDRV_SEQ_PORT_FLG_GIVEN_PORT) ? info->addr.port : -1);
- if (port == NULL)
- return -ENOMEM;
+ if (info->flags & SNDRV_SEQ_PORT_FLG_GIVEN_PORT)
+ port_idx = info->addr.port;
+ else
+ port_idx = -1;
+ err = snd_seq_create_port(client, port_idx, &port);
+ if (err < 0)
+ return err;
if (client->type == USER_CLIENT && info->kernel) {
port_idx = port->addr.port;
diff --git a/sound/core/seq/seq_ports.c b/sound/core/seq/seq_ports.c
index 25fcf5a2c71c..188262b04b72 100644
--- a/sound/core/seq/seq_ports.c
+++ b/sound/core/seq/seq_ports.c
@@ -107,28 +107,30 @@ static void port_subs_info_init(struct snd_seq_port_subs_info *grp)
}
-/* create a port, port number is returned (-1 on failure);
+/* create a port, port number or a negative error code is returned
* the caller needs to unref the port via snd_seq_port_unlock() appropriately
*/
-struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client,
- int port)
+int snd_seq_create_port(struct snd_seq_client *client, int port,
+ struct snd_seq_client_port **port_ret)
{
struct snd_seq_client_port *new_port, *p;
- int num = -1;
+ int num;
+ *port_ret = NULL;
+
/* sanity check */
if (snd_BUG_ON(!client))
- return NULL;
+ return -EINVAL;
if (client->num_ports >= SNDRV_SEQ_MAX_PORTS) {
pr_warn("ALSA: seq: too many ports for client %d\n", client->number);
- return NULL;
+ return -EINVAL;
}
/* create a new port */
new_port = kzalloc(sizeof(*new_port), GFP_KERNEL);
if (!new_port)
- return NULL; /* failure, out of memory */
+ return -ENOMEM; /* failure, out of memory */
/* init port data */
new_port->addr.client = client->number;
new_port->addr.port = -1;
@@ -143,6 +145,10 @@ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client,
mutex_lock(&client->ports_mutex);
write_lock_irq(&client->ports_lock);
list_for_each_entry(p, &client->ports_list_head, list) {
+ if (p->addr.port == port) {
+ num = -EBUSY;
+ goto unlock;
+ }
if (p->addr.port > num)
break;
if (port < 0) /* auto-probe mode */
@@ -153,10 +159,12 @@ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client,
client->num_ports++;
new_port->addr.port = num; /* store the port number in the port */
sprintf(new_port->name, "port-%d", num);
+ *port_ret = new_port;
+ unlock:
write_unlock_irq(&client->ports_lock);
mutex_unlock(&client->ports_mutex);
- return new_port;
+ return num;
}
/* */
diff --git a/sound/core/seq/seq_ports.h b/sound/core/seq/seq_ports.h
index b1f2c4943174..44f0e9e96bbf 100644
--- a/sound/core/seq/seq_ports.h
+++ b/sound/core/seq/seq_ports.h
@@ -86,8 +86,9 @@ struct snd_seq_client_port *snd_seq_port_query_nearest(struct snd_seq_client *cl
/* unlock the port */
#define snd_seq_port_unlock(port) snd_use_lock_free(&(port)->use_lock)
-/* create a port, port number is returned (-1 on failure) */
-struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, int port_index);
+/* create a port, port number or a negative error code is returned */
+int snd_seq_create_port(struct snd_seq_client *client, int port_index,
+ struct snd_seq_client_port **port_ret);
/* delete a port */
int snd_seq_delete_port(struct snd_seq_client *client, int port);
--
2.35.3
next prev parent reply other threads:[~2023-05-19 9:32 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-19 9:30 [PATCH 00/36] ALSA: Add MIDI 2.0 support Takashi Iwai
2023-05-19 9:30 ` [PATCH 01/36] ALSA: rawmidi: Pass rawmidi directly to snd_rawmidi_kernel_open() Takashi Iwai
2023-05-19 9:30 ` [PATCH 02/36] ALSA: rawmidi: Add ioctl callback to snd_rawmidi_global_ops Takashi Iwai
2023-05-19 9:30 ` [PATCH 03/36] ALSA: rawmidi: UMP support Takashi Iwai
2023-05-19 9:30 ` [PATCH 04/36] ALSA: rawmidi: Skip UMP devices at SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE Takashi Iwai
2023-05-19 9:30 ` [PATCH 05/36] ALSA: ump: Additional proc output Takashi Iwai
2023-05-19 9:30 ` [PATCH 06/36] ALSA: usb-audio: Manage number of rawmidis globally Takashi Iwai
2023-05-19 9:30 ` [PATCH 07/36] ALSA: usb-audio: Define USB MIDI 2.0 specs Takashi Iwai
2023-05-19 9:46 ` Greg Kroah-Hartman
2023-05-19 9:30 ` [PATCH 08/36] ALSA: usb-audio: USB MIDI 2.0 UMP support Takashi Iwai
2023-05-19 9:30 ` [PATCH 09/36] ALSA: usb-audio: Get UMP EP name string from USB interface Takashi Iwai
2023-05-19 9:30 ` [PATCH 10/36] ALSA: usb-audio: Trim superfluous "MIDI" suffix from UMP EP name Takashi Iwai
2023-05-19 9:30 ` [PATCH 11/36] ALSA: usb-audio: Create UMP blocks from USB MIDI GTBs Takashi Iwai
2023-05-19 9:30 ` [PATCH 12/36] ALSA: ump: Redirect rawmidi substream access via own helpers Takashi Iwai
2023-05-19 9:30 ` [PATCH 13/36] ALSA: ump: Add legacy raw MIDI support Takashi Iwai
2023-05-19 9:30 ` [PATCH 14/36] ALSA: usb-audio: Enable the " Takashi Iwai
2023-05-19 9:30 ` [PATCH 15/36] ALSA: usb-audio: Inform inconsistent protocols in GTBs Takashi Iwai
2023-05-19 9:30 ` [PATCH 16/36] ALSA: seq: Clear padded bytes at expanding events Takashi Iwai
2023-05-19 9:30 ` [PATCH 17/36] ALSA: seq: Add snd_seq_expand_var_event_at() helper Takashi Iwai
2023-05-19 9:30 ` [PATCH 18/36] ALSA: seq: Treat snd_seq_client object directly in client drivers Takashi Iwai
2023-05-19 9:30 ` [PATCH 19/36] ALSA: seq: Drop dead code for the old broadcast support Takashi Iwai
2023-05-19 9:30 ` Takashi Iwai [this message]
2023-05-19 9:30 ` [PATCH 21/36] ALSA: seq: Check validity before creating a port object Takashi Iwai
2023-05-19 9:31 ` [PATCH 22/36] ALSA: seq: Prohibit creating ports with special numbers Takashi Iwai
2023-05-19 9:31 ` [PATCH 23/36] ALSA: seq: Introduce SNDRV_SEQ_IOCTL_USER_PVERSION ioctl Takashi Iwai
2023-05-19 9:31 ` [PATCH 24/36] ALSA: seq: Add UMP support Takashi Iwai
2023-05-19 9:31 ` [PATCH 25/36] ALSA: seq: Add port inactive flag Takashi Iwai
2023-05-19 9:31 ` [PATCH 26/36] ALSA: seq: Support MIDI 2.0 UMP Endpoint port Takashi Iwai
2023-05-19 9:31 ` [PATCH 27/36] ALSA: seq: Add port direction to snd_seq_port_info Takashi Iwai
2023-05-19 9:31 ` [PATCH 28/36] ALSA: seq: Add UMP group number " Takashi Iwai
2023-05-19 9:31 ` [PATCH 29/36] ALSA: seq: Automatic conversion of UMP events Takashi Iwai
2023-05-19 9:31 ` [PATCH 30/36] ALSA: seq: Allow suppressing UMP conversions Takashi Iwai
2023-05-19 9:31 ` [PATCH 31/36] ALSA: seq: Bind UMP device Takashi Iwai
2023-05-19 9:31 ` [PATCH 32/36] ALSA: seq: ump: Create UMP Endpoint port for broadcast Takashi Iwai
2023-05-19 9:31 ` [PATCH 33/36] ALSA: seq: Add ioctls for client UMP info query and setup Takashi Iwai
2023-05-19 9:31 ` [PATCH 34/36] ALSA: seq: Print UMP Endpoint and Block information in proc outputs Takashi Iwai
2023-05-19 9:31 ` [PATCH 35/36] ALSA: seq: Add UMP group filter Takashi Iwai
2023-05-19 9:31 ` [PATCH 36/36] ALSA: docs: Add MIDI 2.0 documentation Takashi Iwai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230519093114.28813-21-tiwai@suse.de \
--to=tiwai@suse.de \
--cc=alsa-devel@alsa-project.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®