Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: alsa-devel@alsa-project.org
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH v2 18/37] ALSA: seq: Add snd_seq_expand_var_event_at() helper
Date: Tue, 23 May 2023 09:53:39 +0200	[thread overview]
Message-ID: <20230523075358.9672-19-tiwai@suse.de> (raw)
In-Reply-To: <20230523075358.9672-1-tiwai@suse.de>

Create a new variant of snd_seq_expand_var_event() for expanding the
data starting from the given byte offset.  It'll be used by the new
UMP sequencer code later.

Reviewed-by: Jaroslav Kysela <perex@perex.cz>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 include/sound/seq_kernel.h  |  2 +
 sound/core/seq/seq_memory.c | 86 +++++++++++++++++++++++++++++--------
 2 files changed, 69 insertions(+), 19 deletions(-)

diff --git a/include/sound/seq_kernel.h b/include/sound/seq_kernel.h
index 658911926f3a..527e7f8ad661 100644
--- a/include/sound/seq_kernel.h
+++ b/include/sound/seq_kernel.h
@@ -70,6 +70,8 @@ int snd_seq_kernel_client_ctl(int client, unsigned int cmd, void *arg);
 typedef int (*snd_seq_dump_func_t)(void *ptr, void *buf, int count);
 int snd_seq_expand_var_event(const struct snd_seq_event *event, int count, char *buf,
 			     int in_kernel, int size_aligned);
+int snd_seq_expand_var_event_at(const struct snd_seq_event *event, int count,
+				char *buf, int offset);
 int snd_seq_dump_var_event(const struct snd_seq_event *event,
 			   snd_seq_dump_func_t func, void *private_data);
 
diff --git a/sound/core/seq/seq_memory.c b/sound/core/seq/seq_memory.c
index c8d26bce69ff..a8d2db439f86 100644
--- a/sound/core/seq/seq_memory.c
+++ b/sound/core/seq/seq_memory.c
@@ -63,8 +63,9 @@ static int get_var_len(const struct snd_seq_event *event)
 	return event->data.ext.len & ~SNDRV_SEQ_EXT_MASK;
 }
 
-int snd_seq_dump_var_event(const struct snd_seq_event *event,
-			   snd_seq_dump_func_t func, void *private_data)
+static int dump_var_event(const struct snd_seq_event *event,
+			  snd_seq_dump_func_t func, void *private_data,
+			  int offset, int maxlen)
 {
 	int len, err;
 	struct snd_seq_event_cell *cell;
@@ -72,10 +73,16 @@ int snd_seq_dump_var_event(const struct snd_seq_event *event,
 	len = get_var_len(event);
 	if (len <= 0)
 		return len;
+	if (len <= offset)
+		return 0;
+	if (maxlen && len > offset + maxlen)
+		len = offset + maxlen;
 
 	if (event->data.ext.len & SNDRV_SEQ_EXT_USRPTR) {
 		char buf[32];
 		char __user *curptr = (char __force __user *)event->data.ext.ptr;
+		curptr += offset;
+		len -= offset;
 		while (len > 0) {
 			int size = sizeof(buf);
 			if (len < size)
@@ -91,20 +98,35 @@ int snd_seq_dump_var_event(const struct snd_seq_event *event,
 		return 0;
 	}
 	if (!(event->data.ext.len & SNDRV_SEQ_EXT_CHAINED))
-		return func(private_data, event->data.ext.ptr, len);
+		return func(private_data, event->data.ext.ptr + offset,
+			    len - offset);
 
 	cell = (struct snd_seq_event_cell *)event->data.ext.ptr;
 	for (; len > 0 && cell; cell = cell->next) {
 		int size = sizeof(struct snd_seq_event);
+		char *curptr = (char *)&cell->event;
+
+		if (offset >= size) {
+			offset -= size;
+			len -= size;
+			continue;
+		}
 		if (len < size)
 			size = len;
-		err = func(private_data, &cell->event, size);
+		err = func(private_data, curptr + offset, size - offset);
 		if (err < 0)
 			return err;
+		offset = 0;
 		len -= size;
 	}
 	return 0;
 }
+
+int snd_seq_dump_var_event(const struct snd_seq_event *event,
+			   snd_seq_dump_func_t func, void *private_data)
+{
+	return dump_var_event(event, func, private_data, 0, 0);
+}
 EXPORT_SYMBOL(snd_seq_dump_var_event);
 
 
@@ -132,11 +154,27 @@ static int seq_copy_in_user(void *ptr, void *src, int size)
 	return 0;
 }
 
+static int expand_var_event(const struct snd_seq_event *event,
+			    int offset, int size, char *buf, bool in_kernel)
+{
+	if (event->data.ext.len & SNDRV_SEQ_EXT_USRPTR) {
+		if (! in_kernel)
+			return -EINVAL;
+		if (copy_from_user(buf,
+				   (char __force __user *)event->data.ext.ptr + offset,
+				   size))
+			return -EFAULT;
+		return 0;
+	}
+	return dump_var_event(event,
+			     in_kernel ? seq_copy_in_kernel : seq_copy_in_user,
+			     &buf, offset, size);
+}
+
 int snd_seq_expand_var_event(const struct snd_seq_event *event, int count, char *buf,
 			     int in_kernel, int size_aligned)
 {
-	int len, newlen;
-	int err;
+	int len, newlen, err;
 
 	len = get_var_len(event);
 	if (len < 0)
@@ -146,25 +184,35 @@ int snd_seq_expand_var_event(const struct snd_seq_event *event, int count, char
 		newlen = roundup(len, size_aligned);
 	if (count < newlen)
 		return -EAGAIN;
-
-	if (event->data.ext.len & SNDRV_SEQ_EXT_USRPTR) {
-		if (! in_kernel)
-			return -EINVAL;
-		if (copy_from_user(buf, (void __force __user *)event->data.ext.ptr, len))
-			return -EFAULT;
-	} else {
-		err = snd_seq_dump_var_event(event,
-					     in_kernel ? seq_copy_in_kernel : seq_copy_in_user,
-					     &buf);
-		if (err < 0)
-			return err;
-	}
+	err = expand_var_event(event, 0, len, buf, in_kernel);
+	if (err < 0)
+		return err;
 	if (len != newlen)
 		memset(buf + len, 0, newlen - len);
 	return newlen;
 }
 EXPORT_SYMBOL(snd_seq_expand_var_event);
 
+int snd_seq_expand_var_event_at(const struct snd_seq_event *event, int count,
+				char *buf, int offset)
+{
+	int len, err;
+
+	len = get_var_len(event);
+	if (len < 0)
+		return len;
+	if (len <= offset)
+		return 0;
+	len -= offset;
+	if (len > count)
+		len = count;
+	err = expand_var_event(event, offset, count, buf, true);
+	if (err < 0)
+		return err;
+	return len;
+}
+EXPORT_SYMBOL_GPL(snd_seq_expand_var_event_at);
+
 /*
  * release this cell, free extended data if available
  */
-- 
2.35.3


  parent reply	other threads:[~2023-05-23  7:59 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-23  7:53 [PATCH v2 00/37] ALSA: Add MIDI 2.0 support Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 01/37] ALSA: rawmidi: Pass rawmidi directly to snd_rawmidi_kernel_open() Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 02/37] ALSA: rawmidi: Add ioctl callback to snd_rawmidi_global_ops Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 03/37] ALSA: rawmidi: UMP support Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 04/37] ALSA: rawmidi: Skip UMP devices at SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 05/37] ALSA: ump: Add ioctls to inquiry UMP EP and Block info via control API Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 06/37] ALSA: ump: Additional proc output Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 07/37] ALSA: usb-audio: Manage number of rawmidis globally Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 08/37] ALSA: usb-audio: Define USB MIDI 2.0 specs Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 09/37] ALSA: usb-audio: USB MIDI 2.0 UMP support Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 10/37] ALSA: usb-audio: Get UMP EP name string from USB interface Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 11/37] ALSA: usb-audio: Trim superfluous "MIDI" suffix from UMP EP name Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 12/37] ALSA: usb-audio: Create UMP blocks from USB MIDI GTBs Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 13/37] ALSA: ump: Redirect rawmidi substream access via own helpers Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 14/37] ALSA: ump: Add legacy raw MIDI support Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 15/37] ALSA: usb-audio: Enable the " Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 16/37] ALSA: usb-audio: Inform inconsistent protocols in GTBs Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 17/37] ALSA: seq: Clear padded bytes at expanding events Takashi Iwai
2023-05-23  7:53 ` Takashi Iwai [this message]
2023-05-23  7:53 ` [PATCH v2 19/37] ALSA: seq: Treat snd_seq_client object directly in client drivers Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 20/37] ALSA: seq: Drop dead code for the old broadcast support Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 21/37] ALSA: seq: Check the conflicting port at port creation Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 22/37] ALSA: seq: Check validity before creating a port object Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 23/37] ALSA: seq: Prohibit creating ports with special numbers Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 24/37] ALSA: seq: Introduce SNDRV_SEQ_IOCTL_USER_PVERSION ioctl Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 25/37] ALSA: seq: Add UMP support Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 26/37] ALSA: seq: Add port inactive flag Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 27/37] ALSA: seq: Support MIDI 2.0 UMP Endpoint port Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 28/37] ALSA: seq: Add port direction to snd_seq_port_info Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 29/37] ALSA: seq: Add UMP group number " Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 30/37] ALSA: seq: Automatic conversion of UMP events Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 31/37] ALSA: seq: Allow suppressing UMP conversions Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 32/37] ALSA: seq: Bind UMP device Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 33/37] ALSA: seq: ump: Create UMP Endpoint port for broadcast Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 34/37] ALSA: seq: Add ioctls for client UMP info query and setup Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 35/37] ALSA: seq: Print UMP Endpoint and Block information in proc outputs Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 36/37] ALSA: seq: Add UMP group filter Takashi Iwai
2023-05-23  7:53 ` [PATCH v2 37/37] ALSA: docs: Add MIDI 2.0 documentation Takashi Iwai
2023-06-13 12:41 ` [PATCH v2 00/37] ALSA: Add MIDI 2.0 support happy.debugging
2023-06-13 12:53   ` Takashi Iwai
2023-06-13 13:24     ` Happy Debugging
2023-06-13 13:31       ` Takashi Iwai
2023-06-13 15:23         ` Symbolic Debugger
2023-06-14  6:01           ` Symbolic Debugger
2023-06-14  6:09             ` Takashi Iwai
2023-06-14  6:53               ` Takashi Iwai
2023-06-15 11:39                 ` Symbolic Debugger
2023-06-16 12:23                   ` Symbolic Debugger
2023-06-16 12:27                     ` Takashi Iwai
2023-06-16 14:17                       ` Symbolic Debugger
2023-06-17 15:07                         ` Symbolic Debugger
2023-06-18  8:54                           ` Takashi Iwai
2023-06-20 13:29                             ` Symbolic Debugger
2023-06-28  6:52                               ` Symbolic Debugger
2023-06-28 11:12                                 ` Takashi Iwai
2023-06-28 11:32                                   ` Symbolic Debugger
2023-06-28 14:20                                     ` Takashi Iwai
2023-06-29  2:03                                       ` Symbolic Debugger
2023-06-29  6:40                                         ` Takashi Iwai
2023-06-29  8:38                                           ` Symbolic Debugger
2023-07-03 10:15                                             ` Symbolic Debugger
2023-07-03 10:19                                               ` Takashi Iwai
2023-07-03 11:25                                                 ` Symbolic Debugger
2023-07-03 12:09                                                   ` Takashi Iwai
2023-07-03 12:54                                                     ` Symbolic Debugger
2023-07-03 13:01                                                       ` Takashi Iwai
2023-07-03 13:53                                                         ` Symbolic Debugger
2023-07-12 13:26                                                           ` Symbolic Debugger
2023-07-12 13:58                                                             ` 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=20230523075358.9672-19-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