diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/decoder/plugins/ModplugDecoderPlugin.cxx | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/src/decoder/plugins/ModplugDecoderPlugin.cxx b/src/decoder/plugins/ModplugDecoderPlugin.cxx index 336870817..e76737345 100644 --- a/src/decoder/plugins/ModplugDecoderPlugin.cxx +++ b/src/decoder/plugins/ModplugDecoderPlugin.cxx @@ -54,24 +54,29 @@ modplug_decoder_init(const config_param ¶m) static WritableBuffer<uint8_t> mod_loadfile(Decoder *decoder, InputStream &is) { - const InputStream::offset_type size = is.GetSize(); + //known/unknown size, preallocate array, lets read in chunks - if (size == 0) { - LogWarning(modplug_domain, "file is empty"); - return { nullptr, 0 }; - } + const bool is_stream = !is.KnownSize(); - if (size > MODPLUG_FILE_LIMIT) { - LogWarning(modplug_domain, "file too large"); - return { nullptr, 0 }; - } + WritableBuffer<uint8_t> buffer; + if (is_stream) + buffer.size = MODPLUG_PREALLOC_BLOCK; + else { + const auto size = is.GetSize(); + + if (size == 0) { + LogWarning(modplug_domain, "file is empty"); + return { nullptr, 0 }; + } - //known/unknown size, preallocate array, lets read in chunks + if (size > MODPLUG_FILE_LIMIT) { + LogWarning(modplug_domain, "file too large"); + return { nullptr, 0 }; + } - const bool is_stream = size < 0; + buffer.size = size; + } - WritableBuffer<uint8_t> buffer; - buffer.size = is_stream ? MODPLUG_PREALLOC_BLOCK : size; buffer.data = new uint8_t[buffer.size]; uint8_t *const end = buffer.end(); |