Skip to content

Commit

Permalink
iOS GUI: Prevent out-of-memory when parsing large file
Browse files Browse the repository at this point in the history
Signed-off-by: Maxime Gervais <[email protected]>
  • Loading branch information
g-maxime committed Feb 3, 2025
1 parent a55a7a0 commit 9d0a177
Showing 1 changed file with 27 additions and 20 deletions.
47 changes: 27 additions & 20 deletions Source/GUI/iOS/MediaInfo/Core.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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<MediaInfo_int8u> = UnsafeMutablePointer<MediaInfo_int8u>.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<MediaInfo_int8u> = UnsafeMutablePointer<MediaInfo_int8u>.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
}
}
Expand Down Expand Up @@ -252,7 +259,7 @@ class Core {
let cArray: UnsafeMutablePointer<MediaInfo_int8u> = 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))
Expand Down

0 comments on commit 9d0a177

Please sign in to comment.