[vlc-commits] macosx/library: fail creation of data types when the library cannot be reached

Felix Paul Kühne git at videolan.org
Tue Jan 28 11:20:16 CET 2020


vlc | branch: master | Felix Paul Kühne <felix at feepk.net> | Tue Jan 28 11:18:49 2020 +0100| [5ad33dd1c2ef3fd835150dca287e1b852f4fedbe] | committer: Felix Paul Kühne

macosx/library: fail creation of data types when the library cannot be reached

When starting and quitting VLC very quickly, we might still try to create media library data structures while the interface thread already ended, which was leading to a segfault when attempting to access the library with an invalid interface thread pointer.

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

 modules/gui/macosx/library/VLCLibraryDataTypes.h |  6 +--
 modules/gui/macosx/library/VLCLibraryDataTypes.m | 57 ++++++++++++++++++------
 2 files changed, 47 insertions(+), 16 deletions(-)

diff --git a/modules/gui/macosx/library/VLCLibraryDataTypes.h b/modules/gui/macosx/library/VLCLibraryDataTypes.h
index bada8467f8..c643e5e6c8 100644
--- a/modules/gui/macosx/library/VLCLibraryDataTypes.h
+++ b/modules/gui/macosx/library/VLCLibraryDataTypes.h
@@ -153,9 +153,9 @@ extern const long long int VLCMediaLibraryMediaItemDurationDenominator;
 
 + (nullable instancetype)mediaItemForLibraryID:(int64_t)libraryID;
 + (nullable instancetype)mediaItemForURL:(NSURL *)url;
-- (instancetype)initWithMediaItem:(struct vlc_ml_media_t *)mediaItem;
-- (instancetype)initWithExternalURL:(NSURL *)url;
-- (instancetype)initWithStreamURL:(NSURL *)url;
+- (nullable instancetype)initWithMediaItem:(struct vlc_ml_media_t *)mediaItem;
+- (nullable instancetype)initWithExternalURL:(NSURL *)url;
+- (nullable instancetype)initWithStreamURL:(NSURL *)url;
 
 @property (readonly) int64_t libraryID;
 @property (readonly) vlc_ml_media_type_t mediaType;
diff --git a/modules/gui/macosx/library/VLCLibraryDataTypes.m b/modules/gui/macosx/library/VLCLibraryDataTypes.m
index 57555e0879..5aee788748 100644
--- a/modules/gui/macosx/library/VLCLibraryDataTypes.m
+++ b/modules/gui/macosx/library/VLCLibraryDataTypes.m
@@ -180,9 +180,13 @@ NSString *VLCMediaLibraryMediaItemLibraryID = @"VLCMediaLibraryMediaItemLibraryI
 
 @implementation VLCMediaLibraryArtist
 
-+ (instancetype)artistWithID:(int64_t)artistID
++ (nullable instancetype)artistWithID:(int64_t)artistID
 {
-    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(getIntf());
+    intf_thread_t *p_intf = getIntf();
+    if (!p_intf) {
+        return nil;
+    }
+    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(p_intf);
     vlc_ml_artist_t *p_artist = vlc_ml_get_artist(p_mediaLibrary, artistID);
     VLCMediaLibraryArtist *artist = nil;
     if (p_artist) {
@@ -229,7 +233,11 @@ NSString *VLCMediaLibraryMediaItemLibraryID = @"VLCMediaLibraryMediaItemLibraryI
 
 - (NSArray<VLCMediaLibraryMediaItem *> *)tracksAsMediaItems
 {
-    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(getIntf());
+    intf_thread_t *p_intf = getIntf();
+    if (!p_intf) {
+        return @[];
+    }
+    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(p_intf);
     vlc_ml_media_list_t *p_mediaList = vlc_ml_list_album_tracks(p_mediaLibrary, NULL, _albumID);
     NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_mediaList->i_nb_items];
     for (size_t x = 0; x < p_mediaList->i_nb_items; x++) {
@@ -287,7 +295,11 @@ NSString *VLCMediaLibraryMediaItemLibraryID = @"VLCMediaLibraryMediaItemLibraryI
 
 + (nullable instancetype)mediaItemForLibraryID:(int64_t)libraryID
 {
-    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(getIntf());
+    intf_thread_t *p_intf = getIntf();
+    if (!p_intf) {
+        return nil;
+    }
+    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(p_intf);
     vlc_ml_media_t *p_mediaItem = vlc_ml_get_media(p_mediaLibrary, libraryID);
     VLCMediaLibraryMediaItem *returnValue = nil;
     if (p_mediaItem) {
@@ -296,9 +308,13 @@ NSString *VLCMediaLibraryMediaItemLibraryID = @"VLCMediaLibraryMediaItemLibraryI
     return returnValue;
 }
 
-+ (instancetype)mediaItemForURL:(NSURL *)url
++ (nullable instancetype)mediaItemForURL:(NSURL *)url
 {
-    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(getIntf());
+    intf_thread_t *p_intf = getIntf();
+    if (!p_intf) {
+        return nil;
+    }
+    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(p_intf);
     vlc_ml_media_t *p_mediaItem = vlc_ml_get_media_by_mrl(p_mediaLibrary,
                                                           [[url absoluteString] UTF8String]);
     VLCMediaLibraryMediaItem *returnValue = nil;
@@ -308,10 +324,17 @@ NSString *VLCMediaLibraryMediaItemLibraryID = @"VLCMediaLibraryMediaItemLibraryI
     return returnValue;
 }
 
-- (instancetype)initWithMediaItem:(struct vlc_ml_media_t *)p_mediaItem
+- (nullable instancetype)initWithMediaItem:(struct vlc_ml_media_t *)p_mediaItem
 {
-    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(getIntf());
-    return [self initWithMediaItem:p_mediaItem library:p_mediaLibrary];
+    intf_thread_t *p_intf = getIntf();
+    if (!p_intf) {
+        return nil;
+    }
+    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(p_intf);
+    if (p_mediaItem != NULL && p_mediaLibrary != NULL) {
+        return [self initWithMediaItem:p_mediaItem library:p_mediaLibrary];
+    }
+    return nil;
 }
 
 - (instancetype)initWithMediaItem:(struct vlc_ml_media_t *)p_mediaItem library:(vlc_medialibrary_t *)p_mediaLibrary
@@ -374,14 +397,18 @@ NSString *VLCMediaLibraryMediaItemLibraryID = @"VLCMediaLibraryMediaItemLibraryI
     return self;
 }
 
-- (instancetype)initWithExternalURL:(NSURL *)url
+- (nullable instancetype)initWithExternalURL:(NSURL *)url
 {
     NSString *urlString = url.absoluteString;
     if (!urlString) {
         return self;
     }
 
-    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(getIntf());
+    intf_thread_t *p_intf = getIntf();
+    if (!p_intf) {
+        return nil;
+    }
+    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(p_intf);
     vlc_ml_media_t *p_media = vlc_ml_new_external_media(p_mediaLibrary, urlString.UTF8String);
     if (p_media) {
         self = [self initWithMediaItem:p_media library:p_mediaLibrary];
@@ -390,14 +417,18 @@ NSString *VLCMediaLibraryMediaItemLibraryID = @"VLCMediaLibraryMediaItemLibraryI
     return self;
 }
 
-- (instancetype)initWithStreamURL:(NSURL *)url
+- (nullable instancetype)initWithStreamURL:(NSURL *)url
 {
     NSString *urlString = url.absoluteString;
     if (!urlString) {
         return self;
     }
 
-    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(getIntf());
+    intf_thread_t *p_intf = getIntf();
+    if (!p_intf) {
+        return nil;
+    }
+    vlc_medialibrary_t *p_mediaLibrary = vlc_ml_instance_get(p_intf);
     vlc_ml_media_t *p_media = vlc_ml_new_stream(p_mediaLibrary, urlString.UTF8String);
     if (p_media) {
         self = [self initWithMediaItem:p_media library:p_mediaLibrary];



More information about the vlc-commits mailing list