[vlc-commits] audioscrobbler: fix invalid memory access (Closes #5147)

Rafaël Carré git at videolan.org
Mon Aug 1 02:42:08 CEST 2011


vlc/vlc-1.1 | branch: master | Rafaël Carré <rafael.carre at gmail.com> | Sun Jul 31 20:10:44 2011 -0400| [16f626ff7c82c3699758334c03c4390f804a6a1c] | committer: Rafaël Carré

audioscrobbler: fix invalid memory access (Closes #5147)

The metadata structure would not be zeroed when title or artist were missing
(cherry picked from commit b357472ac5a4887a97909ba8c7d14227ae1d3d8b)

Signed-off-by: Rafaël Carré <rafael.carre at gmail.com>

> http://git.videolan.org/gitweb.cgi/vlc/vlc-1.1.git/?a=commit;h=16f626ff7c82c3699758334c03c4390f804a6a1c
---

 modules/misc/audioscrobbler.c |   69 +++++++++++++++--------------------------
 1 files changed, 25 insertions(+), 44 deletions(-)

diff --git a/modules/misc/audioscrobbler.c b/modules/misc/audioscrobbler.c
index 6815da9..95780ce 100644
--- a/modules/misc/audioscrobbler.c
+++ b/modules/misc/audioscrobbler.c
@@ -122,7 +122,7 @@ static int PlayingChange    ( vlc_object_t *, const char *, vlc_value_t,
 
 static void AddToQueue      ( intf_thread_t * );
 static int Handshake        ( intf_thread_t * );
-static int ReadMetaData     ( intf_thread_t * );
+static void ReadMetaData    ( intf_thread_t * );
 static void DeleteSong      ( audioscrobbler_song_t* );
 static int ParseURL         ( char *, char **, char **, int * );
 static void HandleInterval  ( mtime_t *, unsigned int * );
@@ -927,7 +927,7 @@ static void DeleteSong( audioscrobbler_song_t* p_song )
 /*****************************************************************************
  * ReadMetaData : Read meta data when parsed by vlc
  *****************************************************************************/
-static int ReadMetaData( intf_thread_t *p_this )
+static void ReadMetaData( intf_thread_t *p_this )
 {
     input_thread_t      *p_input;
     input_item_t        *p_item;
@@ -936,84 +936,65 @@ static int ReadMetaData( intf_thread_t *p_this )
 
     p_input = playlist_CurrentInput( pl_Get( p_this ) );
     if( !p_input )
-        return( VLC_SUCCESS );
+        return;
 
     p_item = input_GetItem( p_input );
     if( !p_item )
     {
         vlc_object_release( p_input );
-        return VLC_SUCCESS;
+        return;
     }
 
-    char *psz_meta;
-#define ALLOC_ITEM_META( a, b ) \
-    psz_meta = input_item_Get##b( p_item ); \
-    if( psz_meta && *psz_meta ) \
-    { \
-        a = encode_URI_component( psz_meta ); \
-        if( !a ) \
-        { \
-            vlc_mutex_unlock( &p_sys->lock ); \
-            vlc_object_release( p_input ); \
-            free( psz_meta ); \
-            return VLC_ENOMEM; \
-        } \
-    }
+#define ALLOC_ITEM_META( a, b ) do { \
+        char *psz_meta = input_item_Get##b( p_item ); \
+        if( psz_meta && *psz_meta ) \
+            a = encode_URI_component( psz_meta ); \
+        free( psz_meta ); \
+    } while(0)
 
     vlc_mutex_lock( &p_sys->lock );
 
     p_sys->b_meta_read = true;
 
-    ALLOC_ITEM_META( p_sys->p_current_song.psz_a, Artist )
-    else
+    ALLOC_ITEM_META( p_sys->p_current_song.psz_a, Artist );
+    if( !p_sys->p_current_song.psz_a )
     {
-        vlc_mutex_unlock( &p_sys->lock );
         msg_Dbg( p_this, "No artist.." );
-        vlc_object_release( p_input );
-        free( psz_meta );
-        return VLC_EGENERIC;
+        DeleteSong( &p_sys->p_current_song );
+        goto end;
     }
-    free( psz_meta );
 
-    ALLOC_ITEM_META( p_sys->p_current_song.psz_t, Title )
-    else
+    ALLOC_ITEM_META( p_sys->p_current_song.psz_t, Title );
+    if( !p_sys->p_current_song.psz_t )
     {
-        vlc_mutex_unlock( &p_sys->lock );
         msg_Dbg( p_this, "No track name.." );
-        vlc_object_release( p_input );
-        free( p_sys->p_current_song.psz_a );
-        free( psz_meta );
-        return VLC_EGENERIC;
+        DeleteSong( &p_sys->p_current_song );
+        goto end;
     }
-    free( psz_meta );
 
     /* Now we have read the mandatory meta data, so we can submit that info */
     p_sys->b_submit = true;
 
-    ALLOC_ITEM_META( p_sys->p_current_song.psz_b, Album )
-    else
+    ALLOC_ITEM_META( p_sys->p_current_song.psz_b, Album );
+    if( !p_sys->p_current_song.psz_b )
         p_sys->p_current_song.psz_b = calloc( 1, 1 );
-    free( psz_meta );
 
-    ALLOC_ITEM_META( p_sys->p_current_song.psz_m, TrackID )
-    else
+    ALLOC_ITEM_META( p_sys->p_current_song.psz_m, TrackID );
+    if( !p_sys->p_current_song.psz_m )
         p_sys->p_current_song.psz_m = calloc( 1, 1 );
-    free( psz_meta );
 
     p_sys->p_current_song.i_l = input_item_GetDuration( p_item ) / 1000000;
 
-    ALLOC_ITEM_META( p_sys->p_current_song.psz_n, TrackNum )
-    else
+    ALLOC_ITEM_META( p_sys->p_current_song.psz_n, TrackNum );
+    if( !p_sys->p_current_song.psz_n )
         p_sys->p_current_song.psz_n = calloc( 1, 1 );
-    free( psz_meta );
 #undef ALLOC_ITEM_META
 
     msg_Dbg( p_this, "Meta data registered" );
 
+end:
     vlc_mutex_unlock( &p_sys->lock );
     vlc_object_release( p_input );
-    return VLC_SUCCESS;
-
 }
 
 static void HandleInterval( mtime_t *next, unsigned int *i_interval )



More information about the vlc-commits mailing list