ALSA: virtio: Fix "Coverity: virtsnd_kctl_tlv_op(): Uninitialized variables" warning.
authorAiswarya Cyriac <aiswarya.cyriac@opensynergy.com>
Fri, 16 Feb 2024 10:06:43 +0000 (11:06 +0100)
committerTakashi Iwai <tiwai@suse.de>
Fri, 16 Feb 2024 14:01:31 +0000 (15:01 +0100)
This commit fixes the following warning when building virtio_snd driver.

"
*** CID 1583619:  Uninitialized variables  (UNINIT)
sound/virtio/virtio_kctl.c:294 in virtsnd_kctl_tlv_op()
288
289      break;
290      }
291
292      kfree(tlv);
293
vvv     CID 1583619:  Uninitialized variables  (UNINIT)
vvv     Using uninitialized value "rc".
294      return rc;
295     }
296
297     /**
298      * virtsnd_kctl_get_enum_items() - Query items for the ENUMERATED element type.
299      * @snd: VirtIO sound device.
"

This warning is caused by the absence of the "default" branch in the
switch-block, and is a false positive because the kernel calls
virtsnd_kctl_tlv_op() only with values for op_flag processed in
this block.

Also, this commit unifies the cleanup path for all possible control
paths in the callback function.

Signed-off-by: Anton Yakovlev <anton.yakovlev@opensynergy.com>
Signed-off-by: Aiswarya Cyriac <aiswarya.cyriac@opensynergy.com>
Reported-by: coverity-bot <keescook+coverity-bot@chromium.org>
Addresses-Coverity-ID: 1583619 ("Uninitialized variables")
Fixes: d6568e3de42d ("ALSA: virtio: add support for audio controls")
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Link: https://lore.kernel.org/r/20240216100643.688590-1-aiswarya.cyriac@opensynergy.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/virtio/virtio_kctl.c

index 0c6ac74aca1ea74fa002232d7fb2b7c72776131f..7aa79c05b46482978b8bc23cc88171abbc16c935 100644 (file)
@@ -253,8 +253,8 @@ static int virtsnd_kctl_tlv_op(struct snd_kcontrol *kcontrol, int op_flag,
 
        tlv = kzalloc(size, GFP_KERNEL);
        if (!tlv) {
-               virtsnd_ctl_msg_unref(msg);
-               return -ENOMEM;
+               rc = -ENOMEM;
+               goto on_msg_unref;
        }
 
        sg_init_one(&sg, tlv, size);
@@ -281,14 +281,25 @@ static int virtsnd_kctl_tlv_op(struct snd_kcontrol *kcontrol, int op_flag,
                        hdr->hdr.code =
                                cpu_to_le32(VIRTIO_SND_R_CTL_TLV_COMMAND);
 
-               if (copy_from_user(tlv, utlv, size))
+               if (copy_from_user(tlv, utlv, size)) {
                        rc = -EFAULT;
-               else
+                       goto on_msg_unref;
+               } else {
                        rc = virtsnd_ctl_msg_send(snd, msg, &sg, NULL, false);
+               }
 
                break;
+       default:
+               rc = -EINVAL;
+               /* We never get here - we listed all values for op_flag */
+               WARN_ON(1);
+               goto on_msg_unref;
        }
+       kfree(tlv);
+       return rc;
 
+on_msg_unref:
+       virtsnd_ctl_msg_unref(msg);
        kfree(tlv);
 
        return rc;