Index | Thread | Search

From:
Klemens Nanni <kn@openbsd.org>
Subject:
audio/pulseaudio: fix crash in sndio record, enable debug package
To:
ports@openbsd.org
Cc:
Antoine Jacoutot <ajacoutot@openbsd.org>
Date:
Sun, 18 Feb 2024 02:24:33 +0000

Download raw body.

Thread
Playback-only (default) works, record-only crashes:
	$ pulseaudio --dameonize=false -n --load='module-sndio playback=false record=true'
	W: [(null)] pid.c: Stale PID file, overwriting.
	Segmentation fault

	0x000000129050312f in pa_bytes_to_usec () from /usr/local/lib/pulseaudio/libpulsecommon-17.0.so
	#0  0x000000129050312f in pa_bytes_to_usec () from /usr/local/lib/pulseaudio/libpulsecommon-17.0.so
	#1  0x00000012ee794dd9 in module_sndio_LTX_pa__init () from /usr/local/lib/pulseaudio/modules/module-sndio.so
	#2  0x00000012c4ad7c27 in pa_module_load () from /usr/local/lib/pulseaudio/libpulsecore-17.0.so
	#3  0x00000012c4ac031d in ?? () from /usr/local/lib/pulseaudio/libpulsecore-17.0.so
	#4  0x00000012c4abdf9d in pa_cli_command_execute_line_stateful () from /usr/local/lib/pulseaudio/libpulsecore-17.0.so
	#5  0x00000012c4abe9a4 in pa_cli_command_execute () from /usr/local/lib/pulseaudio/libpulsecore-17.0.so
	#6  0x0000001078ec27e8 in main ()

Ship debug symbols so the trace yields line numbers
	#1  0x00000eda1c858dd9 in module_sndio_LTX_pa__init (m=0xed9bc2da0c0) at ../pulseaudio-17.0/src/modules/module-sndio.c:768

and move the offending debug log into `if (mode & PLAYBACK) {' which sets up
u->ink so it doesn't get accessed in record-only mode.

Then pulseaudio starts, burns too many CPU cycles and I haven't figured out
yet how to record from or otherwise verify that PulseAudio actually gets a
mic from sndio, but that's better than crashing...

Feedback? OK?

Index: Makefile
===================================================================
RCS file: /cvs/ports/audio/pulseaudio/Makefile,v
diff -u -p -r1.130 Makefile
--- Makefile	15 Jan 2024 09:38:46 -0000	1.130
+++ Makefile	18 Feb 2024 02:05:28 -0000
@@ -5,6 +5,7 @@ COMMENT=		cross-platform networked sound
 VERSION=		17.0
 DISTNAME=		pulseaudio-${VERSION}
 EXTRACT_SUFX=		.tar.xz
+REVISION=		0
 
 SHARED_LIBS += pulse                     7.2 # 0.24.3
 SHARED_LIBS += pulse-simple              1.2 # 0.1.1
@@ -96,6 +97,8 @@ CONFIGURE_ARGS=		-Ddoxygen=false \
 # Recommended when using GNOME.
 # See https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/832'
 CONFIGURE_ARGS +=	-Dstream-restore-clear-old-devices=false
+
+DEBUG_PACKAGES=		${BUILD_PACKAGES}
 
 post-extract:
 	cp ${FILESDIR}/module-sndio*.{c,h} ${WRKSRC}/src/modules/
Index: files/module-sndio.c
===================================================================
RCS file: /cvs/ports/audio/pulseaudio/files/module-sndio.c,v
diff -u -p -r1.14 module-sndio.c
--- files/module-sndio.c	11 Mar 2022 18:20:27 -0000	1.14
+++ files/module-sndio.c	18 Feb 2024 01:59:18 -0000
@@ -708,6 +708,9 @@ pa__init(pa_module *m)
 		pa_sink_set_get_volume_callback(u->sink, sndio_get_volume);
 		pa_sink_set_set_volume_callback(u->sink, sndio_set_volume);
 		u->sink->n_volume_steps = SIO_MAXVOL + 1;
+
+		pa_log_debug("buffer: frame=%u bytes=%zu msec=%u", u->par.bufsz,
+		    u->bufsz, (unsigned int) pa_bytes_to_usec(u->bufsz, &u->sink->sample_spec));
 	}
 
 	if (mode & SIO_REC) {
@@ -764,9 +767,6 @@ pa__init(pa_module *m)
 		    pa_bytes_to_usec(u->in_hwbuf_size, &u->source->sample_spec));
 */
 	}
-
-	pa_log_debug("buffer: frame=%u bytes=%zu msec=%u", u->par.bufsz,
-	    u->bufsz, (unsigned int) pa_bytes_to_usec(u->bufsz, &u->sink->sample_spec));
 
 	pa_memchunk_reset(&u->memchunk);