No freezing when size in header is too large

Give warning if the size in header mismatch the actual file size. If
data chunk size is greater than the actual data size, try to import by
treating all the remaining data as data chunk and give warning to users.
This commit is contained in:
Ainsley Su 2024-10-01 20:43:32 +02:00
parent 24b4607309
commit cd126a041e
No known key found for this signature in database
GPG key ID: 50AE6139D40772C1

View file

@ -112,7 +112,15 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
} }
/* GET FILESIZE */ /* GET FILESIZE */
file->get_32(); // filesize
// The file size in header is 8 bytes less than the actual size.
// See https://docs.fileformat.com/audio/wav/
const int FILE_SIZE_HEADER_OFFSET = 8;
uint32_t file_size_header = file->get_32() + FILE_SIZE_HEADER_OFFSET;
uint64_t file_size = file->get_length();
if (file_size != file_size_header) {
WARN_PRINT(vformat("File size %d is %s than the expected size %d. (%s)", file_size, file_size > file_size_header ? "larger" : "smaller", file_size_header, p_source_file));
}
/* CHECK WAVE */ /* CHECK WAVE */
@ -198,7 +206,12 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
break; break;
} }
uint64_t remaining_bytes = file_size - file_pos;
frames = chunksize; frames = chunksize;
if (remaining_bytes < chunksize) {
WARN_PRINT(vformat("Data chunk size is smaller than expected. Proceeding with actual data size. (%s)", p_source_file));
frames = remaining_bytes;
}
if (format_channels == 0) { if (format_channels == 0) {
ERR_FAIL_COND_V(format_channels == 0, ERR_INVALID_DATA); ERR_FAIL_COND_V(format_channels == 0, ERR_INVALID_DATA);