From 174f2114dc6b7c94a5e1e5db1d4615aa746b61d0 Mon Sep 17 00:00:00 2001 From: Daryl Poe Date: Fri, 26 Jul 2013 13:54:20 -0600 Subject: [PATCH] fix segfault due to pulse input race condition (cherry picked from commit be5167654153cad02f821decc39ad35cd239a6ed) --- channels/audin/client/pulse/audin_pulse.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/channels/audin/client/pulse/audin_pulse.c b/channels/audin/client/pulse/audin_pulse.c index 2d4906ea2..787f208bd 100644 --- a/channels/audin/client/pulse/audin_pulse.c +++ b/channels/audin/client/pulse/audin_pulse.c @@ -290,6 +290,17 @@ static void audin_pulse_stream_request_callback(pa_stream* stream, size_t length BYTE* encoded_data; AudinPulseDevice* pulse = (AudinPulseDevice*) userdata; + /* There is a race condition here where we may receive this callback + * before the buffer has been set up in the main code. It's probably + * possible to fix with additional locking, but it's easier just to + * ignore input until the buffer is ready. + */ + if (pulse->buffer == NULL) + { + /* fprintf(stderr, "%s: ignoring input, pulse buffer not ready.\n", __func__); */ + return; + } + pa_stream_peek(stream, &data, &length); frames = length / pulse->bytes_per_frame; @@ -373,6 +384,7 @@ static void audin_pulse_open(IAudinDevice* device, AudinReceive receive, void* u DEBUG_DVC(""); + pulse->buffer = NULL; pulse->receive = receive; pulse->user_data = user_data;