Browse Source

stb_vorbis: Increase max alloc buffer size for big Vorbis comments

The previous max worked OK for audio data, but stb_vorbis recently gained support
for Vorbis comments, which can embed up to 2^32-1 bytes of data (e.g. cover art
encoded as base64).

We use 2^30 as max which should be sufficient for most files.

Fixes #41913.

(cherry picked from commit d16f5a57c1882da245032b4543dbeb6d02931dbf)
Rémi Verschelde 5 years ago
parent
commit
36fa6369fc
1 changed files with 6 additions and 2 deletions
  1. 6 2
      modules/stb_vorbis/audio_stream_ogg_vorbis.cpp

+ 6 - 2
modules/stb_vorbis/audio_stream_ogg_vorbis.cpp

@@ -167,14 +167,16 @@ void AudioStreamOGGVorbis::clear_data() {
 void AudioStreamOGGVorbis::set_data(const PoolVector<uint8_t> &p_data) {
 void AudioStreamOGGVorbis::set_data(const PoolVector<uint8_t> &p_data) {
 
 
 	int src_data_len = p_data.size();
 	int src_data_len = p_data.size();
-#define MAX_TEST_MEM (1 << 20)
-
 	uint32_t alloc_try = 1024;
 	uint32_t alloc_try = 1024;
 	PoolVector<char> alloc_mem;
 	PoolVector<char> alloc_mem;
 	PoolVector<char>::Write w;
 	PoolVector<char>::Write w;
 	stb_vorbis *ogg_stream = NULL;
 	stb_vorbis *ogg_stream = NULL;
 	stb_vorbis_alloc ogg_alloc;
 	stb_vorbis_alloc ogg_alloc;
 
 
+	// Vorbis comments may be up to UINT32_MAX, but that's arguably pretty rare.
+	// Let's go with 2^30 so we don't risk going out of bounds.
+	const uint32_t MAX_TEST_MEM = 1 << 30;
+
 	while (alloc_try < MAX_TEST_MEM) {
 	while (alloc_try < MAX_TEST_MEM) {
 
 
 		alloc_mem.resize(alloc_try);
 		alloc_mem.resize(alloc_try);
@@ -216,6 +218,8 @@ void AudioStreamOGGVorbis::set_data(const PoolVector<uint8_t> &p_data) {
 			break;
 			break;
 		}
 		}
 	}
 	}
+
+	ERR_FAIL_COND_MSG(alloc_try == MAX_TEST_MEM, vformat("Couldn't set vorbis data even with an alloc buffer of %d bytes, report bug.", MAX_TEST_MEM));
 }
 }
 
 
 PoolVector<uint8_t> AudioStreamOGGVorbis::get_data() const {
 PoolVector<uint8_t> AudioStreamOGGVorbis::get_data() const {