summaryrefslogtreecommitdiff
path: root/src/demuxers
diff options
context:
space:
mode:
Diffstat (limited to 'src/demuxers')
-rw-r--r--src/demuxers/demux_flac.c2
-rw-r--r--src/demuxers/demux_matroska.c14
-rw-r--r--src/demuxers/id3.c5
3 files changed, 17 insertions, 4 deletions
diff --git a/src/demuxers/demux_flac.c b/src/demuxers/demux_flac.c
index 2e84eb4b7..ed974a69c 100644
--- a/src/demuxers/demux_flac.c
+++ b/src/demuxers/demux_flac.c
@@ -201,7 +201,7 @@ static int open_flac_file(demux_flac_t *flac) {
length = _X_LE_32(ptr);
ptr += 4 + length;
- if (length >= block_length - 8)
+ if (length > block_length - 8)
return 0; /* bad length or too little left in the buffer */
user_comment_list_length = _X_LE_32(ptr);
diff --git a/src/demuxers/demux_matroska.c b/src/demuxers/demux_matroska.c
index ae71923d6..ec932aacb 100644
--- a/src/demuxers/demux_matroska.c
+++ b/src/demuxers/demux_matroska.c
@@ -1833,6 +1833,15 @@ static int read_block_data (demux_matroska_t *this, int len) {
return 1;
}
+static int parse_int16(uint8_t *data) {
+ int value = (int)_X_BE_16(data);
+ if (value & 1<<15)
+ {
+ value -= 1<<16;
+ }
+ return value;
+}
+
static int parse_block (demux_matroska_t *this, uint64_t block_size,
uint64_t cluster_timecode, uint64_t block_duration,
int normpos, int is_key) {
@@ -1849,8 +1858,9 @@ static int parse_block (demux_matroska_t *this, uint64_t block_size,
if (!(num_len = parse_ebml_uint(this, data, &track_num)))
return 0;
data += num_len;
-
- timecode_diff = (int)_X_BE_16(data);
+
+ /* timecode_diff is signed */
+ timecode_diff = parse_int16(data);
data += 2;
flags = *data;
diff --git a/src/demuxers/id3.c b/src/demuxers/id3.c
index f65d5564c..71cb5e743 100644
--- a/src/demuxers/id3.c
+++ b/src/demuxers/id3.c
@@ -543,6 +543,7 @@ int id3v23_parse_tag(input_plugin_t *input,
if (!id3v23_parse_frame_ext_header(input, &tag_frame_ext_header)) {
return 0;
}
+ pos += tag_frame_ext_header.size;
}
/* frame parsing */
while ((pos + ID3V23_FRAME_HEADER_SIZE) <= tag_header.size) {
@@ -563,7 +564,8 @@ int id3v23_parse_tag(input_plugin_t *input,
pos += tag_frame_header.size;
} else {
/* end of frames, the rest is padding */
- input->seek (input, tag_header.size - pos, SEEK_CUR);
+ lprintf("skipping padding %d bytes\n", tag_header.size - pos);
+ input->seek (input, tag_header.size - pos, SEEK_CUR);
return 1;
}
} else {
@@ -785,6 +787,7 @@ int id3v24_parse_tag(input_plugin_t *input,
if (!id3v24_parse_ext_header(input, &tag_frame_ext_header)) {
return 0;
}
+ pos += tag_frame_ext_header.size;
}
/* frame parsing */
while ((pos + ID3V24_FRAME_HEADER_SIZE) <= tag_header.size) {