vlc | branch: master | Hugo Beauzée-Luyssen <[email protected]> | Mon Dec 3 10:14:10 2018 +0100| [244c1c2229a5bb96d90dec230f08409cc50c93a1] | committer: Hugo Beauzée-Luyssen
medialibrary: Fix TOCTOU when accesing mrls > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=244c1c2229a5bb96d90dec230f08409cc50c93a1 --- include/vlc_media_library.h | 2 ++ modules/misc/medialibrary/entities.cpp | 30 +++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/include/vlc_media_library.h b/include/vlc_media_library.h index 6e51b502fa..27a4324465 100644 --- a/include/vlc_media_library.h +++ b/include/vlc_media_library.h @@ -121,6 +121,8 @@ typedef struct vlc_ml_file_t char* psz_mrl; vlc_ml_file_type_t i_type; bool b_external; + bool b_removable; + bool b_present; } vlc_ml_file_t; typedef struct vlc_ml_file_list_t diff --git a/modules/misc/medialibrary/entities.cpp b/modules/misc/medialibrary/entities.cpp index ef78221780..c9c411639f 100644 --- a/modules/misc/medialibrary/entities.cpp +++ b/modules/misc/medialibrary/entities.cpp @@ -38,6 +38,7 @@ #include <medialibrary/IAudioTrack.h> #include <medialibrary/IVideoTrack.h> #include <medialibrary/IFolder.h> +#include <medialibrary/filesystem/IDevice.h> #include <algorithm> @@ -260,8 +261,18 @@ bool Convert( const medialibrary::IFile* input, vlc_ml_file_t& output ) vlc_assert_unreachable(); } - if( !strdup_helper( input->mrl(), output.psz_mrl ) ) - return false; + output.b_removable = input->isRemovable(); + output.b_present = true; + try + { + if( !strdup_helper( input->mrl(), output.psz_mrl ) ) + return false; + } + catch ( const medialibrary::fs::DeviceRemovedException& ) + { + output.psz_mrl = nullptr; + output.b_present = false; + } output.b_external = input->isExternal(); return true; @@ -371,13 +382,13 @@ bool Convert( const medialibrary::IPlaylist* input, vlc_ml_playlist_t& output ) bool Convert( const medialibrary::IFolder* input, vlc_ml_entry_point_t& output ) { - if ( input->isPresent() == true ) + try { if ( strdup_helper( input->mrl(), output.psz_mrl ) == false ) return false; output.b_present = true; } - else + catch ( const medialibrary::fs::DeviceRemovedException& ) { output.psz_mrl = nullptr; output.b_present = false; @@ -394,8 +405,17 @@ input_item_t* MediaToInputItem( const medialibrary::IMedia* media ) return f->type() == medialibrary::IFile::Type::Main; }); assert( it != cend( files ) ); + std::string mrl; + try + { + mrl = (*it)->mrl(); + } + catch ( const medialibrary::fs::DeviceRemovedException& ex ) + { + return nullptr; + } auto inputItem = vlc::wrap_cptr<input_item_t>( - input_item_NewExt( (*it)->mrl().c_str(), media->fileName().c_str(), + input_item_NewExt( mrl.c_str(), media->fileName().c_str(), VLC_TICK_FROM_MS( media->duration() ), ITEM_TYPE_FILE, ITEM_NET_UNKNOWN ), &input_item_Release ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
