[vlc-commits] DirectSound: fix double free on error (close #5966)

Rémi Denis-Courmont git at videolan.org
Wed Feb 1 19:35:57 CET 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Feb  1 20:33:07 2012 +0200| [9eb9a10ebaba458575de38941a0f002ea79bbf60] | committer: Rémi Denis-Courmont

DirectSound: fix double free on error (close #5966)

Regression from 6d90bf20c01db2b284a81b26ce3356536257c1fc

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9eb9a10ebaba458575de38941a0f002ea79bbf60
---

 modules/audio_output/directx.c |   20 +++++---------------
 1 files changed, 5 insertions(+), 15 deletions(-)

diff --git a/modules/audio_output/directx.c b/modules/audio_output/directx.c
index 6a69b04..4afa919 100644
--- a/modules/audio_output/directx.c
+++ b/modules/audio_output/directx.c
@@ -92,7 +92,6 @@ struct aout_sys_t
  *****************************************************************************/
 static int  OpenAudio  ( vlc_object_t * );
 static void CloseAudio ( vlc_object_t * );
-static void CloseAudioCommon ( vlc_object_t * );
 static void Play       ( audio_output_t *, block_t * );
 
 /* local functions */
@@ -278,8 +277,7 @@ static int OpenAudio( vlc_object_t *p_this )
             != VLC_SUCCESS )
         {
             msg_Err( p_aout, "cannot open directx audio device" );
-            free( p_aout->sys );
-            return VLC_EGENERIC;
+            goto error;
         }
 
         /* Calculate the frame size in bytes */
@@ -303,8 +301,8 @@ static int OpenAudio( vlc_object_t *p_this )
         msg_Err( p_aout, "cannot create DirectSoundThread" );
         CloseHandle( p_aout->sys->notif.event );
         p_aout->sys->notif.event = NULL;
-        CloseAudio( VLC_OBJECT(p_aout) );
-        return VLC_EGENERIC;
+        aout_PacketDestroy( p_aout );
+        goto error;
     }
 
     p_aout->pf_play = Play;
@@ -314,7 +312,7 @@ static int OpenAudio( vlc_object_t *p_this )
     return VLC_SUCCESS;
 
  error:
-    CloseAudioCommon( VLC_OBJECT(p_aout) );
+    CloseAudio( VLC_OBJECT(p_aout) );
     return VLC_EGENERIC;
 }
 
@@ -578,13 +576,6 @@ static void Play( audio_output_t *p_aout, block_t *p_buffer )
 static void CloseAudio( vlc_object_t *p_this )
 {
     audio_output_t * p_aout = (audio_output_t *)p_this;
-    aout_PacketDestroy( p_aout );
-    CloseAudioCommon( p_this );
-}
-
-static void CloseAudioCommon( vlc_object_t *p_this )
-{
-    audio_output_t * p_aout = (audio_output_t *)p_this;
     aout_sys_t *p_sys = p_aout->sys;
 
     msg_Dbg( p_aout, "closing audio device" );
@@ -599,6 +590,7 @@ static void CloseAudioCommon( vlc_object_t *p_this )
 
         vlc_join( p_sys->notif.thread, NULL );
         CloseHandle( p_sys->notif.event );
+        aout_PacketDestroy( p_aout );
     }
 
     /* release the secondary buffer */
@@ -610,8 +602,6 @@ static void CloseAudioCommon( vlc_object_t *p_this )
     /* free DSOUND.DLL */
     if( p_sys->hdsound_dll ) FreeLibrary( p_sys->hdsound_dll );
 
-    aout_PacketDestroy( p_aout );
-
     free( p_aout->sys->p_device_guid );
     free( p_sys );
 }



More information about the vlc-commits mailing list