François Cartegnie pushed to branch 3.0.x at VideoLAN / VLC


Commits:
cb230876 by Tristan Matthews at 2026-01-07T20:57:48+01:00
speex: rtp: fix leak on decoding error

Fixes CID #1665523

(cherry picked from commit 83213a9856127707e905e403ee3688fc6cb39bd1)

- - - - -
565dca7c by Tristan Matthews at 2026-01-07T20:58:01+01:00
speex: fix leak on decoding error or EOS

Fixes CID #1665515

(cherry picked from commit 2756323fdfc5c9c2cac2429e9a9dbd2fc7d214eb)

- - - - -
9dc69e3e by Tristan Matthews at 2026-01-07T20:58:10+01:00
speex: assert against empty frame_size in header

(cherry picked from commit f25231481734e10f06f84fcc8341e402987b163b)

- - - - -
0a8dad8a by Tristan Matthews at 2026-01-07T21:03:25+01:00
speex: bail if block_(Re)Alloc failed

(cherry picked from commit 28daa76a3cbd155f45c30759d54e18bb462f84ce)

- - - - -
a316cdf2 by Tristan Matthews at 2026-01-07T21:03:28+01:00
speex: fix leak on allocation failure

Fixes CID 1666162

(cherry picked from commit defb38eabf64a0b1fdc53f7d25c74974ec7eae55)

- - - - -
f8320532 by Tristan Matthews at 2026-01-07T21:03:38+01:00
speex: cosmetic cleanup

(cherry picked from commit 250fcee5cd97f92ee8a2782abc4170c6815435b6)

- - - - -


1 changed file:

- modules/codec/speex.c


Changes:

=====================================
modules/codec/speex.c
=====================================
@@ -619,6 +619,9 @@ static block_t *ProcessPacket( decoder_t *p_dec, ogg_packet 
*p_oggpacket,
                 / 8;
 
             p_new_block = block_Alloc( i_bytes_in_speex_frame );
+            if( unlikely(p_new_block == NULL) )
+                return NULL;
+
             memset( p_new_block->p_buffer, 0xff, i_bytes_in_speex_frame );
 
             /*
@@ -642,15 +645,22 @@ static block_t *ProcessPacket( decoder_t *p_dec, 
ogg_packet *p_oggpacket,
             if ( i_bits_after > 7 )
             {
                 /* round-down since we rounded-up earlier (to include
-             * the speex terminator code.
-             */
+                 * the speex terminator code.
+                 */
                 i_bytes_in_speex_frame--;
                 speex_bits_write( &p_sys->bits,
                     (char*)p_block->p_buffer,
                     p_block->i_buffer - i_bytes_in_speex_frame );
+
                 p_block = block_Realloc( p_block,
                     0,
                     p_block->i_buffer-i_bytes_in_speex_frame );
+                if( unlikely(p_block == NULL) )
+                {
+                    block_Release( p_new_block );
+                    return NULL;
+                }
+
                 *pp_block = p_block;
             }
             else
@@ -663,7 +673,7 @@ static block_t *ProcessPacket( decoder_t *p_dec, ogg_packet 
*p_oggpacket,
         }
         else
         {
-                return SendPacket( p_dec, p_block );
+            return SendPacket( p_dec, p_block );
         }
     }
     else
@@ -750,6 +760,7 @@ static int DecodeRtpSpeexPacket( decoder_t *p_dec, block_t 
*p_speex_bit_block )
     if ( !date_Get( &p_sys->end_date ) )
         date_Set( &p_sys->end_date, p_speex_bit_block->i_dts );
 
+    assert( p_sys->p_header->frame_size > 0 );
     /*
       Ask for a new audio output buffer and make sure
       we get one.
@@ -759,7 +770,7 @@ static int DecodeRtpSpeexPacket( decoder_t *p_dec, block_t 
*p_speex_bit_block )
     else
         p_aout_buffer = decoder_NewAudioBuffer( p_dec,
             p_sys->p_header->frame_size );
-    if ( !p_aout_buffer || p_aout_buffer->i_buffer == 0 )
+    if ( !p_aout_buffer )
     {
         msg_Err(p_dec, "Oops: No new buffer was returned!");
         return VLCDEC_SUCCESS;
@@ -780,6 +791,7 @@ static int DecodeRtpSpeexPacket( decoder_t *p_dec, block_t 
*p_speex_bit_block )
             (int16_t*)p_aout_buffer->p_buffer );
     if ( i_decode_ret < 0 )
     {
+        block_Release( p_aout_buffer );
         msg_Err( p_dec, "Decoding failed. Perhaps we have a bad stream?" );
         return VLCDEC_SUCCESS;
     }
@@ -835,6 +847,7 @@ static block_t *DecodePacket( decoder_t *p_dec, ogg_packet 
*p_oggpacket )
             case -2:
                 msg_Err( p_dec, "decoding error: corrupted stream?" );
             case -1: /* End of stream */
+                block_Release( p_aout_buffer );
                 return NULL;
         }
 
@@ -903,7 +916,6 @@ static void ParseSpeexComments( decoder_t *p_dec, 
ogg_packet *p_oggpacket )
             return;
     }
 
-    /* */
     char *psz_mode;
     if( asprintf( &psz_mode, "%s%s", p_mode->modeName, p_sys->p_header->vbr ? 
" VBR" : "" ) >= 0 )
     {
@@ -1164,6 +1176,9 @@ static block_t *Encode( encoder_t *p_enc, block_t 
*p_aout_buf )
         speex_bits_reset( &p_sys->bits );
 
         p_block = block_Alloc( i_out );
+        if( unlikely(p_block == NULL) )
+            break;
+
         memcpy( p_block->p_buffer, p_sys->p_buffer_out, i_out );
 
         p_block->i_length = (vlc_tick_t)1000000 *



View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/79128878ddb2c280bbb6c89c76a46b31a80ade1c...f8320532910244e7d68f4d35c50f626178861e3d

-- 
View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/79128878ddb2c280bbb6c89c76a46b31a80ade1c...f8320532910244e7d68f4d35c50f626178861e3d
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance
_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to