From f283f95dcbef24e2a91537e91ed3fc9d8171e482 Mon Sep 17 00:00:00 2001 From: Mike Brady Date: Mon, 28 Aug 2017 21:33:29 +0100 Subject: [PATCH] Fix an issue where it would terminate if it could not allocate an excessively large buffer. --- player.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/player.c b/player.c index 4a563834..fe3bb350 100644 --- a/player.c +++ b/player.c @@ -1829,11 +1829,15 @@ static void *player_thread_func(void *arg) { // debug(1, "Large positive sync error: %lld. Dropping the frame.", sync_error); } else if ((sync_error < 0) && ((-sync_error) > filler_length)) { // debug(1, "Large negative sync error: %lld. Inserting silence.", sync_error); - char *long_silence = malloc(conn->output_bytes_per_frame * (-sync_error)); + size_t silence_length = -sync_error; + if (silence_length>(filler_length*5)) + silence_length = filler_length*5; + + char *long_silence = malloc(conn->output_bytes_per_frame * silence_length); if (long_silence == NULL) - die("Failed to allocate memory for a long_silence buffer."); - memset(long_silence, 0, conn->output_bytes_per_frame * (-sync_error)); - config.output->play((short *)long_silence, (-sync_error)); + die("Failed to allocate memory for a long_silence buffer of %d frames.",silence_length); + memset(long_silence, 0, conn->output_bytes_per_frame * silence_length); + config.output->play((short *)long_silence, silence_length); free(long_silence); } } else {