Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [bug report] ALSA: firewire-motu: notify event for parameter change in register DSP model
@ 2023-01-06  9:31 Dan Carpenter
  2023-01-07  4:30 ` Takashi Sakamoto
  0 siblings, 1 reply; 2+ messages in thread
From: Dan Carpenter @ 2023-01-06  9:31 UTC (permalink / raw)
  To: o-takashi; +Cc: alsa-devel

Hello Takashi Sakamoto,

The patch 634ec0b2906e: "ALSA: firewire-motu: notify event for
parameter change in register DSP model" from Oct 15, 2021, leads to
the following Smatch static checker warning:

	sound/firewire/motu/motu-hwdep.c:92 hwdep_read()
	warn: inconsistent returns '&motu->lock'.

sound/firewire/motu/motu-hwdep.c
    27 static long hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count,
    28                        loff_t *offset)
    29 {
    30         struct snd_motu *motu = hwdep->private_data;
    31         DEFINE_WAIT(wait);
    32         union snd_firewire_event event;
    33 
    34         spin_lock_irq(&motu->lock);
    35 
    36         while (!motu->dev_lock_changed && motu->msg == 0 && !has_dsp_event(motu)) {
    37                 prepare_to_wait(&motu->hwdep_wait, &wait, TASK_INTERRUPTIBLE);
    38                 spin_unlock_irq(&motu->lock);
    39                 schedule();
    40                 finish_wait(&motu->hwdep_wait, &wait);
    41                 if (signal_pending(current))
    42                         return -ERESTARTSYS;
    43                 spin_lock_irq(&motu->lock);
    44         }
    45 
    46         memset(&event, 0, sizeof(event));
    47         if (motu->dev_lock_changed) {
    48                 event.lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS;
    49                 event.lock_status.status = (motu->dev_lock_count > 0);
    50                 motu->dev_lock_changed = false;
    51                 spin_unlock_irq(&motu->lock);
    52 
    53                 count = min_t(long, count, sizeof(event));
    54                 if (copy_to_user(buf, &event, count))
    55                         return -EFAULT;
    56         } else if (motu->msg > 0) {
    57                 event.motu_notification.type = SNDRV_FIREWIRE_EVENT_MOTU_NOTIFICATION;
    58                 event.motu_notification.message = motu->msg;
    59                 motu->msg = 0;
    60                 spin_unlock_irq(&motu->lock);
    61 
    62                 count = min_t(long, count, sizeof(event));
    63                 if (copy_to_user(buf, &event, count))
    64                         return -EFAULT;
    65         } else if (has_dsp_event(motu)) {
    66                 size_t consumed = 0;
    67                 u32 __user *ptr;
    68                 u32 ev;
    69 
    70                 spin_unlock_irq(&motu->lock);
    71 
    72                 // Header is filled later.
    73                 consumed += sizeof(event.motu_register_dsp_change);
    74 
    75                 while (consumed < count &&
    76                        snd_motu_register_dsp_message_parser_copy_event(motu, &ev)) {
    77                         ptr = (u32 __user *)(buf + consumed);
    78                         if (put_user(ev, ptr))
    79                                 return -EFAULT;
    80                         consumed += sizeof(ev);
    81                 }
    82 
    83                 event.motu_register_dsp_change.type = SNDRV_FIREWIRE_EVENT_MOTU_REGISTER_DSP_CHANGE;
    84                 event.motu_register_dsp_change.count =
    85                         (consumed - sizeof(event.motu_register_dsp_change)) / 4;
    86                 if (copy_to_user(buf, &event, sizeof(event.motu_register_dsp_change)))
    87                         return -EFAULT;
    88 
    89                 count = consumed;
    90         }

Smatch complains that there is no "} else {" path which unlocks.


    91 
--> 92         return count;
    93 }

regards,
dan carpenter

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [bug report] ALSA: firewire-motu: notify event for parameter change in register DSP model
  2023-01-06  9:31 [bug report] ALSA: firewire-motu: notify event for parameter change in register DSP model Dan Carpenter
@ 2023-01-07  4:30 ` Takashi Sakamoto
  0 siblings, 0 replies; 2+ messages in thread
From: Takashi Sakamoto @ 2023-01-07  4:30 UTC (permalink / raw)
  To: Dan Carpenter; +Cc: alsa-devel

Hi,

On Fri, Jan 06, 2023 at 12:31:12PM +0300, Dan Carpenter wrote:
> Hello Takashi Sakamoto,
> 
> The patch 634ec0b2906e: "ALSA: firewire-motu: notify event for
> parameter change in register DSP model" from Oct 15, 2021, leads to
> the following Smatch static checker warning:
> 
> 	sound/firewire/motu/motu-hwdep.c:92 hwdep_read()
> 	warn: inconsistent returns '&motu->lock'.
 
Indeed. When no event is available, the bug appears. Later, I'll post
quick fix. Thanks.

> sound/firewire/motu/motu-hwdep.c
>     27 static long hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count,
>     28                        loff_t *offset)
>     29 {
>     30         struct snd_motu *motu = hwdep->private_data;
>     31         DEFINE_WAIT(wait);
>     32         union snd_firewire_event event;
>     33 
>     34         spin_lock_irq(&motu->lock);
>     35 
>     36         while (!motu->dev_lock_changed && motu->msg == 0 && !has_dsp_event(motu)) {
>     37                 prepare_to_wait(&motu->hwdep_wait, &wait, TASK_INTERRUPTIBLE);
>     38                 spin_unlock_irq(&motu->lock);
>     39                 schedule();
>     40                 finish_wait(&motu->hwdep_wait, &wait);
>     41                 if (signal_pending(current))
>     42                         return -ERESTARTSYS;
>     43                 spin_lock_irq(&motu->lock);
>     44         }
>     45 
>     46         memset(&event, 0, sizeof(event));
>     47         if (motu->dev_lock_changed) {
>     48                 event.lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS;
>     49                 event.lock_status.status = (motu->dev_lock_count > 0);
>     50                 motu->dev_lock_changed = false;
>     51                 spin_unlock_irq(&motu->lock);
>     52 
>     53                 count = min_t(long, count, sizeof(event));
>     54                 if (copy_to_user(buf, &event, count))
>     55                         return -EFAULT;
>     56         } else if (motu->msg > 0) {
>     57                 event.motu_notification.type = SNDRV_FIREWIRE_EVENT_MOTU_NOTIFICATION;
>     58                 event.motu_notification.message = motu->msg;
>     59                 motu->msg = 0;
>     60                 spin_unlock_irq(&motu->lock);
>     61 
>     62                 count = min_t(long, count, sizeof(event));
>     63                 if (copy_to_user(buf, &event, count))
>     64                         return -EFAULT;
>     65         } else if (has_dsp_event(motu)) {
>     66                 size_t consumed = 0;
>     67                 u32 __user *ptr;
>     68                 u32 ev;
>     69 
>     70                 spin_unlock_irq(&motu->lock);
>     71 
>     72                 // Header is filled later.
>     73                 consumed += sizeof(event.motu_register_dsp_change);
>     74 
>     75                 while (consumed < count &&
>     76                        snd_motu_register_dsp_message_parser_copy_event(motu, &ev)) {
>     77                         ptr = (u32 __user *)(buf + consumed);
>     78                         if (put_user(ev, ptr))
>     79                                 return -EFAULT;
>     80                         consumed += sizeof(ev);
>     81                 }
>     82 
>     83                 event.motu_register_dsp_change.type = SNDRV_FIREWIRE_EVENT_MOTU_REGISTER_DSP_CHANGE;
>     84                 event.motu_register_dsp_change.count =
>     85                         (consumed - sizeof(event.motu_register_dsp_change)) / 4;
>     86                 if (copy_to_user(buf, &event, sizeof(event.motu_register_dsp_change)))
>     87                         return -EFAULT;
>     88 
>     89                 count = consumed;
>     90         }
> 
> Smatch complains that there is no "} else {" path which unlocks.
> 
> 
>     91 
> --> 92         return count;
>     93 }
> 
> regards,
> dan carpenter

Takashi Sakamoto

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-01-07  4:31 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-01-06  9:31 [bug report] ALSA: firewire-motu: notify event for parameter change in register DSP model Dan Carpenter
2023-01-07  4:30 ` Takashi Sakamoto

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox