aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-08-19 20:53:02 +0200
committerMax Kellermann <max@duempel.org>2014-08-19 20:53:02 +0200
commit2e64afca27e608e7f9e3be38cb6afd14211933ef (patch)
tree00e8d8479c2fa53508d0eef8f4e6f4110befb14b
parent51cda0be2a82a4557b7c5944f268edc28745fae8 (diff)
downloadmpd-2e64afca27e608e7f9e3be38cb6afd14211933ef.tar.gz
mpd-2e64afca27e608e7f9e3be38cb6afd14211933ef.tar.xz
mpd-2e64afca27e608e7f9e3be38cb6afd14211933ef.zip
decoder/modplug: check InputStream::KnownSize()
-rw-r--r--src/decoder/plugins/ModplugDecoderPlugin.cxx31
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 &param)
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();