Merge pull request #58130 from timothyqiu/ogg-seek-crash

Fix infinite recursion when seeking Ogg Vorbis file
This commit is contained in:
Ellen Poe 2022-02-16 20:14:31 -08:00 committed by GitHub
commit 76f667bf2a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 3 additions and 1 deletions

View File

@ -162,6 +162,7 @@ bool OGGPacketSequencePlayback::next_ogg_packet(ogg_packet **p_packet) const {
} }
uint32_t OGGPacketSequencePlayback::seek_page_internal(int64_t granule, uint32_t after_page_inclusive, uint32_t before_page_inclusive) { uint32_t OGGPacketSequencePlayback::seek_page_internal(int64_t granule, uint32_t after_page_inclusive, uint32_t before_page_inclusive) {
// FIXME: This function needs better corner case handling.
if (before_page_inclusive == after_page_inclusive) { if (before_page_inclusive == after_page_inclusive) {
return before_page_inclusive; return before_page_inclusive;
} }
@ -169,7 +170,8 @@ uint32_t OGGPacketSequencePlayback::seek_page_internal(int64_t granule, uint32_t
// Complicating the bisection search algorithm, the middle page might not have a packet that ends on it, // Complicating the bisection search algorithm, the middle page might not have a packet that ends on it,
// which means it might not have a correct granule position. Find a nearby page that does have a packet ending on it. // which means it might not have a correct granule position. Find a nearby page that does have a packet ending on it.
uint32_t bisection_page = -1; uint32_t bisection_page = -1;
for (uint32_t test_page = actual_middle_page; test_page <= before_page_inclusive; test_page++) { // Don't include before_page_inclusive because that always succeeds and will cause infinite recursion later.
for (uint32_t test_page = actual_middle_page; test_page < before_page_inclusive; test_page++) {
if (ogg_packet_sequence->page_data[test_page].size() > 0) { if (ogg_packet_sequence->page_data[test_page].size() > 0) {
bisection_page = test_page; bisection_page = test_page;
break; break;