diff options
Diffstat (limited to 'apps/codecs/libwavpack/metadata.c')
-rw-r--r-- | apps/codecs/libwavpack/metadata.c | 9 |
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--; |