summaryrefslogtreecommitdiffstats
path: root/modules/vorbis
diff options
context:
space:
mode:
authorMichael Wörner <michael.woerner@blickshift.de>2024-01-16 11:31:51 +0100
committerMichael Wörner <michael.woerner@blickshift.de>2024-01-16 23:42:25 +0100
commita4db4ae6581a6e4f051d8aea2c562c1165d22590 (patch)
tree152fa7b3ac3a1cc642451fbe61234c82002e8f93 /modules/vorbis
parent6bb89c71ff65ee117a7dce4576026d716ee390e5 (diff)
downloadredot-engine-a4db4ae6581a6e4f051d8aea2c562c1165d22590.tar.gz
Fixed an issue that could cause a crash when encountering a zero-length packet in an OGG stream.
A zero-length memcpy into a null pointer itself does not fail, but for gcc with optimizations, this can cause incorrect code to be generated further down the line since the pointer is then assumed to be non-null. Now stripping zero-length packets and pages without packets from the OggPacketSequence during import. This prevents various warning and error messages for files that end on a zero-length packet.
Diffstat (limited to 'modules/vorbis')
-rw-r--r--modules/vorbis/resource_importer_ogg_vorbis.cpp14
1 files changed, 8 insertions, 6 deletions
diff --git a/modules/vorbis/resource_importer_ogg_vorbis.cpp b/modules/vorbis/resource_importer_ogg_vorbis.cpp
index bf5d964d39..7b8d14741b 100644
--- a/modules/vorbis/resource_importer_ogg_vorbis.cpp
+++ b/modules/vorbis/resource_importer_ogg_vorbis.cpp
@@ -212,11 +212,13 @@ Ref<AudioStreamOggVorbis> ResourceImporterOggVorbis::load_from_buffer(const Vect
granule_pos = packet.granulepos;
}
- PackedByteArray data;
- data.resize(packet.bytes);
- memcpy(data.ptrw(), packet.packet, packet.bytes);
- sorted_packets[granule_pos].push_back(data);
- packet_count++;
+ if (packet.bytes > 0) {
+ PackedByteArray data;
+ data.resize(packet.bytes);
+ memcpy(data.ptrw(), packet.packet, packet.bytes);
+ sorted_packets[granule_pos].push_back(data);
+ packet_count++;
+ }
}
Vector<Vector<uint8_t>> packet_data;
for (const KeyValue<uint64_t, Vector<Vector<uint8_t>>> &pair : sorted_packets) {
@@ -224,7 +226,7 @@ Ref<AudioStreamOggVorbis> ResourceImporterOggVorbis::load_from_buffer(const Vect
packet_data.push_back(packets);
}
}
- if (initialized_stream) {
+ if (initialized_stream && packet_data.size() > 0) {
ogg_packet_sequence->push_page(ogg_page_granulepos(&page), packet_data);
}
}