From 3bd2cc9860016486b369b9e02e6feb73abd5411a Mon Sep 17 00:00:00 2001 From: Luke F <283772+lukefor@users.noreply.github.com> Date: Fri, 29 Jul 2022 20:17:30 +0100 Subject: [PATCH 1/3] Resolve a System.IndexOutOfRangeException when requesting IDs that do not exist via /Users/.../Items. Previously it was possible for the 'index' values in 'positions' to refer beyond 'size'. [ERR] Error processing request. URL "GET" "/Users/.../Items". System.IndexOutOfRangeException: Index was outside the bounds of the array. at MediaBrowser.Controller.Entities.Folder.SortItemsByRequest(InternalItemsQuery query, IReadOnlyList`1 items) at MediaBrowser.Controller.Entities.Folder.GetItems(InternalItemsQuery query) at Jellyfin.Api.Controllers.ItemsController.GetItems --- MediaBrowser.Controller/Entities/Folder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index b6983b73ee..dda5d70e86 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -901,7 +901,7 @@ namespace MediaBrowser.Controller.Entities int index = 0; for (int i = 0; i < ids.Length; i++) { - if (positions.TryAdd(ids[i], index)) + if (items.Any(item => item.Id == ids[i]) && positions.TryAdd(ids[i], index)) { index++; } From 8f28d5292971600e6e06036a828bbcdd7ff5e8f2 Mon Sep 17 00:00:00 2001 From: Luke F <283772+lukefor@users.noreply.github.com> Date: Thu, 18 Aug 2022 00:15:57 +0100 Subject: [PATCH 2/3] Code review - simplify SortItemsByRequest to a single roughly-equivalent linq expression --- MediaBrowser.Controller/Entities/Folder.cs | 24 +--------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index dda5d70e86..f3e79c6e28 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -892,29 +892,7 @@ namespace MediaBrowser.Controller.Entities private static BaseItem[] SortItemsByRequest(InternalItemsQuery query, IReadOnlyList items) { - var ids = query.ItemIds; - int size = items.Count; - - // ids can potentially contain non-unique guids, but query result cannot, - // so we include only first occurrence of each guid - var positions = new Dictionary(size); - int index = 0; - for (int i = 0; i < ids.Length; i++) - { - if (items.Any(item => item.Id == ids[i]) && positions.TryAdd(ids[i], index)) - { - index++; - } - } - - var newItems = new BaseItem[size]; - for (int i = 0; i < size; i++) - { - var item = items[i]; - newItems[positions[item.Id]] = item; - } - - return newItems; + return items.OrderBy(i => Array.IndexOf(query.ItemIds, i.Id)).ToArray(); } public QueryResult GetItems(InternalItemsQuery query) From b59daab27351aa386d975b7d31bab4208b8e0885 Mon Sep 17 00:00:00 2001 From: Luke F <283772+lukefor@users.noreply.github.com> Date: Thu, 18 Aug 2022 00:26:55 +0100 Subject: [PATCH 3/3] Tab -> space --- MediaBrowser.Controller/Entities/Folder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index f3e79c6e28..3f2fa9228a 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -892,7 +892,7 @@ namespace MediaBrowser.Controller.Entities private static BaseItem[] SortItemsByRequest(InternalItemsQuery query, IReadOnlyList items) { - return items.OrderBy(i => Array.IndexOf(query.ItemIds, i.Id)).ToArray(); + return items.OrderBy(i => Array.IndexOf(query.ItemIds, i.Id)).ToArray(); } public QueryResult GetItems(InternalItemsQuery query)