summaryrefslogtreecommitdiff
path: root/apps/codecs/libwavpack/metadata.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libwavpack/metadata.c')
-rw-r--r--apps/codecs/libwavpack/metadata.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/apps/codecs/libwavpack/metadata.c b/apps/codecs/libwavpack/metadata.c
index c944093b19..4dce10100f 100644
--- a/apps/codecs/libwavpack/metadata.c
+++ b/apps/codecs/libwavpack/metadata.c
@@ -19,15 +19,16 @@ int read_metadata_buff (WavpackContext *wpc, WavpackMetadata *wpmd)
19 uint32_t bytes_to_read; 19 uint32_t bytes_to_read;
20 uchar tchar; 20 uchar tchar;
21 21
22 if (!wpc->infile (&wpmd->id, 1) || !wpc->infile (&tchar, 1)) 22 if (wpc->stream.block_bytes_left < 2 || !wpc->infile (&wpmd->id, 1) || !wpc->infile (&tchar, 1))
23 return FALSE; 23 return FALSE;
24 24
25 wpmd->byte_length = tchar << 1; 25 wpmd->byte_length = tchar << 1;
26 wpc->stream.block_bytes_left -= 2;
26 27
27 if (wpmd->id & ID_LARGE) { 28 if (wpmd->id & ID_LARGE) {
28 wpmd->id &= ~ID_LARGE; 29 wpmd->id &= ~ID_LARGE;
29 30
30 if (!wpc->infile (&tchar, 1)) 31 if (wpc->stream.block_bytes_left < 2 || !wpc->infile (&tchar, 1))
31 return FALSE; 32 return FALSE;
32 33
33 wpmd->byte_length += (int32_t) tchar << 9; 34 wpmd->byte_length += (int32_t) tchar << 9;
@@ -36,8 +37,12 @@ int read_metadata_buff (WavpackContext *wpc, WavpackMetadata *wpmd)
36 return FALSE; 37 return FALSE;
37 38
38 wpmd->byte_length += (int32_t) tchar << 17; 39 wpmd->byte_length += (int32_t) tchar << 17;
40 wpc->stream.block_bytes_left -= 2;
39 } 41 }
40 42
43 if ((wpc->stream.block_bytes_left -= wpmd->byte_length) < 0)
44 return FALSE;
45
41 if (wpmd->id & ID_ODD_SIZE) { 46 if (wpmd->id & ID_ODD_SIZE) {
42 wpmd->id &= ~ID_ODD_SIZE; 47 wpmd->id &= ~ID_ODD_SIZE;
43 wpmd->byte_length--; 48 wpmd->byte_length--;