From 9d0a1770229f022552cd951535d4e2666505929a Mon Sep 17 00:00:00 2001 From: Maxime Gervais Date: Mon, 3 Feb 2025 09:57:05 +0100 Subject: [PATCH] iOS GUI: Prevent out-of-memory when parsing large file Signed-off-by: Maxime Gervais --- Source/GUI/iOS/MediaInfo/Core.swift | 47 +++++++++++++++++------------ 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/Source/GUI/iOS/MediaInfo/Core.swift b/Source/GUI/iOS/MediaInfo/Core.swift index b839b0dc0..2177417e2 100644 --- a/Source/GUI/iOS/MediaInfo/Core.swift +++ b/Source/GUI/iOS/MediaInfo/Core.swift @@ -174,30 +174,37 @@ class Core { MediaInfo_Open_Buffer_Init(mi, fileSize, 0) while true { - let data: Data = file.readData(ofLength: 1024 * 1024) - var state: States = States(rawValue: 0) - let size = data.count + let finished = autoreleasepool { + let data: Data = file.readData(ofLength: 1024 * 1024) + var state: States = States(rawValue: 0) + let size = data.count + + let buffer: UnsafeMutablePointer = UnsafeMutablePointer.allocate(capacity: size) + data.copyBytes(to: buffer, count: size) + state = States(rawValue: Int(MediaInfo_Open_Buffer_Continue(mi, buffer, UInt(size)))) + buffer.deallocate() + + if state == States.Finalized { + return true + } - let buffer: UnsafeMutablePointer = UnsafeMutablePointer.allocate(capacity: size) - data.copyBytes(to: buffer, count: size) - state = States(rawValue: MediaInfo_Open_Buffer_Continue(mi, buffer, size)) - buffer.deallocate() + // test if there is a MediaInfo request to go elsewhere + let seekTo: MediaInfo_int64u = MediaInfo_Open_Buffer_Continue_GoTo_Get(mi) - if state == States.Finalized { - break - } + if seekTo != MediaInfo_int64u.max { + file.seek(toFileOffset: seekTo) + MediaInfo_Open_Buffer_Init(mi, fileSize, file.offsetInFile) // inform MediaInfo we have seek + return false + } - // test if there is a MediaInfo request to go elsewhere - let seekTo: MediaInfo_int64u = MediaInfo_Open_Buffer_Continue_GoTo_Get(mi) + // EOF and no seekTo request + if data.count == 0 { + return true + } - if seekTo != MediaInfo_int64u.max { - file.seek(toFileOffset: seekTo) - MediaInfo_Open_Buffer_Init(mi, fileSize, file.offsetInFile) // inform MediaInfo we have seek - continue + return false } - - // EOF and no seekTo request - if data.count == 0 { + if (finished) { break } } @@ -252,7 +259,7 @@ class Core { let cArray: UnsafeMutablePointer = UnsafeMutablePointer(mutating: report) MediaInfo_Open_Buffer_Init(mi, MediaInfo_int64u(report.count), MediaInfo_int64u(0)) - MediaInfo_Open_Buffer_Continue(mi, cArray, report.count) + MediaInfo_Open_Buffer_Continue(mi, cArray, UInt(report.count)) MediaInfo_Open_Buffer_Finalize(mi) output = wideStringToString(wideString: MediaInfo_Inform(mi, 0))