[bug report] ALSA: firewire-motu: notify event for parameter change in register DSP model

Dan Carpenter error27 at gmail.com
Fri Jan 6 10:31:12 CET 2023


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


More information about the Alsa-devel mailing list