From nobody Tue Oct 27 11:28:09 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4jDSsk1kfrz6xRCS for ; Tue, 27 Oct 2026 11:28:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4jDSsk0KRfz56td for ; Tue, 27 Oct 2026 11:28:10 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793100490; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=X8ZcaTbpikbm5D7WofWkbuJJOO13jVuMECwp6/Fdob8=; b=V36A1CQxGpS0WT1rjY7fmGrII1+yVOlOADdOFJYWQMnUXJM/RzxMCidnsVXBh5MLvCaBDX EE+0d+UfXzq574uoFl3dEKIx8NrxFRjo5NIsPD6S1smu9SAfA/ZZd1z++bDlvvLFgSJNfg 9NDg41dPdHGFmWgkFC14gUgwRX93WyGOsxGjDcU6TlEsaUeOi6p0bj4wIhVZgTcaH71REi STKd8DbX4gqNU8bMh0LGF6nemqZhLg10LcN7SiCcbZymu8vYhuyHNoM9ZAJFoFX+W1Q+ds DUMQyYJ7rT8mpOqKqUxvmENZBKQ8rBdzeitjtlxoiru8zND0vGFSup3h6ZqV6g== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1793100490; b=IvVeTAAsZJWqRRgTsYrBmzgghPe5R3oP6IQas8mZM+2h0J7cw0iA6V3ILQjfL8+6AYSbj8 v+3EL4sFXKLTeXi1Sb4e4JTYqEONje0HwiHtwcLr2+5I1XbP04B+oanaLLLcm8XXZBFOOZ 9/rl937B7/PWlUTebFQP8TuFPKgyPX+jU/FZMbLFF7P46qnhgpQVe0QJ+z6z/r9GTPKnry oHZk9FOZ0qEY/QPLCsDPFnpHNFxa9peaHzDrbCHRV5YLhelEcm6CakC88DLVJoEr69ao0R gWc+eJ7X7m1WPyvsoGME9gMfYUFyj1SASSIKc7gq2mDthg72sWpWfwFZABUF+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793100490; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=X8ZcaTbpikbm5D7WofWkbuJJOO13jVuMECwp6/Fdob8=; b=h7zmil1veV3jUCnNYDU04Az5onuZRpXO8c1z4XdbwHvbRY8n8On5gTFe0MTNs9u6psX82+ wyXJ+n1m9ADBjZNnQqlLTqqaDaMII2Hib0nh9SYQCkivSLRBTQRbDrtjVxEpXG0QO1pq1T VYxY14MCnih3BBwYIx7NoN7WllG0NZMEGojHWzS5lmOVVfF1HYMtDb0lPyQS1cRCh7s+Pj v27S5B6tOkyL5X5sFwmZrnl08oPigPTPlW+iXznfnk5JkNId4m5vBXo9ZGAiYxaD+ZIX3/ 3l0Hz1wnp3cMFq96ri4TWHdiH8doXsav/QqBOoZd/7QcYBQmNoF8//lHtNSW+A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4jDSsj74sBzJT8 for ; Tue, 27 Oct 2026 11:28:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 26a69 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 27 Oct 2026 11:28:09 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Christos Margiolis Subject: git: 5760c22a0522 - main - sound: Let pcm_unregister() tear down a partially initialized device List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: Commit messages for all branches of the src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: christos X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 5760c22a05220cfb6b6cbf623f2cda5047b28706 Auto-Submitted: auto-generated Date: Tue, 27 Oct 2026 11:28:09 +0000 Message-Id: <6ae08ac9.26a69.7d7ee271@gitrepo.freebsd.org> The branch main has been updated by christos: URL: https://cgit.FreeBSD.org/src/commit/?id=5760c22a05220cfb6b6cbf623f2cda5047b28706 commit 5760c22a05220cfb6b6cbf623f2cda5047b28706 Author: Christos Margiolis AuthorDate: 2026-10-27 11:26:29 +0000 Commit: Christos Margiolis CommitDate: 2026-10-27 11:26:29 +0000 sound: Let pcm_unregister() tear down a partially initialized device Since 3107b952f534 ("sound: Merge PCM_ALIVE() with PCM_REGISTERED()"), pcm_unregister() is gated on PCM_REGISTERED(), so it cannot run unless pcm_register() has already succeeded, which means drivers will leak resources if a failure happened prior to this. Reintroduce PCM_ALIVE(), but test dev rather than the lock. pcm_init() assigns dev before anything else, so it can tell us whether pcm_init() has run or not. Make sure to clear it in pcm_unregister() so that a second call to pcm_unregister() cannot double-free. While here, publish to sndstat(4) only once pcm_register() has succeeded. Reported by: jah Fixes: 3107b952f534 ("sound: Merge PCM_ALIVE() with PCM_REGISTERED()") MFC after: 1 week Sponsored by: The FreeBSD Foundation Reviewed by: jah, markj Differential Revision: https://reviews.freebsd.org/D60801 --- sys/dev/sound/pcm/dsp.c | 9 ++++++++- sys/dev/sound/pcm/sound.c | 10 ++++++---- sys/dev/sound/pcm/sound.h | 4 ++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c index e1242ec4deb4..9277a1f337ff 100644 --- a/sys/dev/sound/pcm/dsp.c +++ b/sys/dev/sound/pcm/dsp.c @@ -160,7 +160,14 @@ dsp_destroy_dev(device_t dev) struct snddev_info *d; d = device_get_softc(dev); - destroy_dev(d->dsp_dev); + /* + * The cdev may not exist if the driver failed before or during + * pcm_register(). + */ + if (d->dsp_dev != NULL) { + destroy_dev(d->dsp_dev); + d->dsp_dev = NULL; + } } static int diff --git a/sys/dev/sound/pcm/sound.c b/sys/dev/sound/pcm/sound.c index 92aedb552d27..f0db8554c950 100644 --- a/sys/dev/sound/pcm/sound.c +++ b/sys/dev/sound/pcm/sound.c @@ -428,8 +428,6 @@ pcm_register(device_t dev, char *str) vchan_initsys(dev); feeder_eq_initsys(dev); - sndstat_register(dev, SNDST_TYPE_PCM, d->status); - err = dsp_make_dev(dev); if (err) return (err); @@ -441,6 +439,9 @@ pcm_register(device_t dev, char *str) } } + /* Publish only once registration really has finished properly. */ + sndstat_register(dev, SNDST_TYPE_PCM, d->status); + bus_topo_lock(); if (snd_unit_auto < 0) snd_unit_auto = (snd_unit < 0) ? 1 : 0; @@ -463,8 +464,8 @@ pcm_unregister(device_t dev) d = device_get_softc(dev); - if (!PCM_REGISTERED(d)) { - device_printf(dev, "unregister: device not configured\n"); + if (!PCM_ALIVE(d)) { + device_printf(dev, "unregister: device not initialized\n"); return (0); } @@ -496,6 +497,7 @@ pcm_unregister(device_t dev) cv_destroy(&d->cv); mtx_destroy(&d->lock); + d->dev = NULL; bus_topo_lock(); if (snd_unit == device_get_unit(dev)) { diff --git a/sys/dev/sound/pcm/sound.h b/sys/dev/sound/pcm/sound.h index ecd4dec5a170..16110e46a152 100644 --- a/sys/dev/sound/pcm/sound.h +++ b/sys/dev/sound/pcm/sound.h @@ -122,8 +122,8 @@ struct snd_mixer; "\015PVCHANS" \ "\016RVCHANS" -#define PCM_REGISTERED(x) \ - ((x) != NULL && ((x)->flags & SD_F_REGISTERED)) +#define PCM_ALIVE(x) ((x) != NULL && (x)->dev != NULL) +#define PCM_REGISTERED(x) (PCM_ALIVE(x) && ((x)->flags & SD_F_REGISTERED)) #define PCM_MAXCHANS 10000 #define PCM_CHANCOUNT(d) \