The branch main has been updated by christos:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=fc9dc848239652ec1e4135adb4833a5f002cef0f

commit fc9dc848239652ec1e4135adb4833a5f002cef0f
Author:     Christos Margiolis <[email protected]>
AuthorDate: 2026-05-28 09:31:52 +0000
Commit:     Christos Margiolis <[email protected]>
CommitDate: 2026-05-28 13:02:01 +0000

    snd_uaudio: Lock usbd_transfer_start() in uaudio_mixer_ctl_set()
    
    This section would be previously locked by sound(4)'s mixer lock (see
    e87654db5a09 ("snd_uaudio: Stop using mixer_get_lock()")), but
    snd_uaudio(4) no longer uses it. This particular code path was missed
    during testing, because my sound card does not reach it.
    
    Fixes:          9a00e0b8ca56 ("snd_uaudio: Do not use snd_mixer->lock as 
mixer_lock")
    Reported by:    netchild
    Tested by:      netchild
    Sponsored by:   The FreeBSD Foundation
    MFC after:      6 days
---
 sys/dev/sound/usb/uaudio.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index 27d5009da4fa..eedd52774b70 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -5386,8 +5386,8 @@ uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int 
val)
 }
 
 static void
-uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct uaudio_mixer_node *mc,
-    uint8_t chan, int val)
+uaudio_mixer_ctl_set(struct uaudio_softc *sc, unsigned index,
+    struct uaudio_mixer_node *mc, uint8_t chan, int val)
 {
        val = uaudio_mixer_bsd2value(mc, val);
 
@@ -5396,7 +5396,9 @@ uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct 
uaudio_mixer_node *mc,
 
        /* start the transfer, if not already started */
 
+       mtx_lock(&sc->sc_child[index].mixer_lock);
        usbd_transfer_start(sc->sc_mixer_xfer[0]);
+       mtx_unlock(&sc->sc_child[index].mixer_lock);
 }
 
 static void
@@ -5482,7 +5484,7 @@ uaudio_mixer_set(struct uaudio_softc *sc, struct 
snd_mixer *m,
        for (mc = sc->sc_mixer_root; mc != NULL; mc = mc->next) {
                if (mc->ctl == type) {
                        for (chan = 0; chan < mc->nchan; chan++) {
-                               uaudio_mixer_ctl_set(sc, mc, chan,
+                               uaudio_mixer_ctl_set(sc, index, mc, chan,
                                    chan == 0 ? left : right);
                        }
                }
@@ -5523,7 +5525,7 @@ uaudio_mixer_setrecsrc(struct uaudio_softc *sc, struct 
snd_mixer *m, uint32_t sr
                        for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) 
{
                                if (temp != (1U << mc->slctrtype[i - 1]))
                                        continue;
-                               uaudio_mixer_ctl_set(sc, mc, 0, i);
+                               uaudio_mixer_ctl_set(sc, index, mc, 0, i);
                                break;
                        }
                }

Reply via email to