Skip to content

Commit

Permalink
ALSA: fireface: add field for the number of messages copied to user s…
Browse files Browse the repository at this point in the history
…pace

Current structure includes no field to express the number of messages
copied to user space, thus user space application needs to information
out of the structure to parse the content of structure.

This commit adds a field to express the number of messages copied to user
space since It is more preferable to use self-contained structure.

Kees Cook proposed an idea of annotation for bound of flexible arrays
in his future improvement for flexible-length array in kernel. The
additional field for message count is suitable to the idea as well.

Reference: https://people.kernel.org/kees/bounded-flexible-arrays-in-c
Signed-off-by: Takashi Sakamoto <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
takaswie authored and tiwai committed Feb 4, 2023
1 parent d045bce commit 0d9eb7e
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 12 deletions.
2 changes: 2 additions & 0 deletions include/uapi/sound/firewire.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ struct snd_firewire_event_motu_register_dsp_change {
* operating hardware knob.
*
* @type: Fixed to SNDRV_FIREWIRE_EVENT_FF400_MESSAGE.
* @message_count: The number of messages.
* @messages.message: The messages expressing hardware knob operation.
* @messages.tstamp: The isochronous cycle at which the request subaction of asynchronous
* transaction was sent to deliver the message. It has 16 bit unsigned integer
Expand All @@ -89,6 +90,7 @@ struct snd_firewire_event_motu_register_dsp_change {
*/
struct snd_firewire_event_ff400_message {
unsigned int type;
unsigned int message_count;
struct {
__u32 message;
__u32 tstamp;
Expand Down
28 changes: 16 additions & 12 deletions sound/firewire/fireface/ff-protocol-former.c
Original file line number Diff line number Diff line change
Expand Up @@ -677,23 +677,19 @@ static void ff400_handle_msg(struct snd_ff *ff, unsigned int offset, const __le3

static long ff400_copy_msg_to_user(struct snd_ff *ff, char __user *buf, long count)
{
struct snd_firewire_event_ff400_message ev = {
.type = SNDRV_FIREWIRE_EVENT_FF400_MESSAGE,
.message_count = 0,
};
struct ff400_msg_parser *parser = ff->msg_parser;
u32 type = SNDRV_FIREWIRE_EVENT_FF400_MESSAGE;
long consumed = 0;
int ret = 0;
long ret = 0;

if (count < 8)
if (count < sizeof(ev) || parser->pull_pos == parser->push_pos)
return 0;

spin_unlock_irq(&ff->lock);
if (copy_to_user(buf, &type, sizeof(type)))
ret = -EFAULT;
spin_lock_irq(&ff->lock);
if (ret)
return ret;

count -= sizeof(type);
consumed += sizeof(type);
count -= sizeof(ev);
consumed += sizeof(ev);

while (count >= sizeof(*parser->msgs) && parser->pull_pos != parser->push_pos) {
spin_unlock_irq(&ff->lock);
Expand All @@ -707,10 +703,18 @@ static long ff400_copy_msg_to_user(struct snd_ff *ff, char __user *buf, long cou
++parser->pull_pos;
if (parser->pull_pos >= FF400_QUEUE_SIZE)
parser->pull_pos = 0;
++ev.message_count;
count -= sizeof(*parser->msgs);
consumed += sizeof(*parser->msgs);
}

spin_unlock_irq(&ff->lock);
if (copy_to_user(buf, &ev, sizeof(ev)))
ret = -EFAULT;
spin_lock_irq(&ff->lock);
if (ret)
return ret;

return consumed;
}

Expand Down

0 comments on commit 0d9eb7e

Please sign in to comment.