wavparse: Ignore EOS when parsing the headers
The file might be truncated or contain < 8 bytes of remaining data after the last chunk. Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4426 Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8956>
This commit is contained in:
parent
a332a411b7
commit
ba8fd35e72
@ -1322,10 +1322,13 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
GstMapInfo map;
|
GstMapInfo map;
|
||||||
|
|
||||||
buf = NULL;
|
buf = NULL;
|
||||||
if ((res =
|
res = gst_wavparse_pull_range_exact (wav, wav->offset, 8, &buf);
|
||||||
gst_wavparse_pull_range_exact (wav, wav->offset, 8,
|
if (res == GST_FLOW_EOS) {
|
||||||
&buf)) != GST_FLOW_OK)
|
gotdata = TRUE;
|
||||||
|
break;
|
||||||
|
} else if (res != GST_FLOW_OK) {
|
||||||
goto header_pull_error;
|
goto header_pull_error;
|
||||||
|
}
|
||||||
gst_buffer_map (buf, &map, GST_MAP_READ);
|
gst_buffer_map (buf, &map, GST_MAP_READ);
|
||||||
tag = GST_READ_UINT32_LE (map.data);
|
tag = GST_READ_UINT32_LE (map.data);
|
||||||
size = GST_READ_UINT32_LE (map.data + 4);
|
size = GST_READ_UINT32_LE (map.data + 4);
|
||||||
@ -1428,9 +1431,12 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
} else {
|
} else {
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
buf = NULL;
|
buf = NULL;
|
||||||
if ((res =
|
res =
|
||||||
gst_wavparse_pull_range_exact (wav, wav->offset + 8,
|
gst_wavparse_pull_range_exact (wav, wav->offset + 8,
|
||||||
data_size, &buf)) != GST_FLOW_OK)
|
data_size, &buf);
|
||||||
|
if (res == GST_FLOW_EOS)
|
||||||
|
break;
|
||||||
|
else if (res != GST_FLOW_OK)
|
||||||
goto header_pull_error;
|
goto header_pull_error;
|
||||||
gst_buffer_extract (buf, 0, &wav->fact, 4);
|
gst_buffer_extract (buf, 0, &wav->fact, 4);
|
||||||
wav->fact = GUINT32_FROM_LE (wav->fact);
|
wav->fact = GUINT32_FROM_LE (wav->fact);
|
||||||
@ -1474,9 +1480,12 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
GstMapInfo map;
|
GstMapInfo map;
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
buf = NULL;
|
buf = NULL;
|
||||||
if ((res =
|
res =
|
||||||
gst_wavparse_pull_range_exact (wav, wav->offset + 8, size,
|
gst_wavparse_pull_range_exact (wav, wav->offset + 8, size, &buf);
|
||||||
&buf)) != GST_FLOW_OK)
|
goto header_pull_error;
|
||||||
|
if (res == GST_FLOW_EOS)
|
||||||
|
break;
|
||||||
|
else if (res != GST_FLOW_OK)
|
||||||
goto header_pull_error;
|
goto header_pull_error;
|
||||||
gst_buffer_map (buf, &map, GST_MAP_READ);
|
gst_buffer_map (buf, &map, GST_MAP_READ);
|
||||||
tempo = GST_READ_FLOAT_LE (map.data + 20);
|
tempo = GST_READ_FLOAT_LE (map.data + 20);
|
||||||
@ -1517,9 +1526,10 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
} else {
|
} else {
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
buf = NULL;
|
buf = NULL;
|
||||||
if ((res =
|
res = gst_wavparse_pull_range_exact (wav, wav->offset, 12, &buf);
|
||||||
gst_wavparse_pull_range_exact (wav, wav->offset, 12,
|
if (res == GST_FLOW_EOS)
|
||||||
&buf)) != GST_FLOW_OK)
|
break;
|
||||||
|
else if (res != GST_FLOW_OK)
|
||||||
goto header_pull_error;
|
goto header_pull_error;
|
||||||
gst_buffer_extract (buf, 8, <ag, 4);
|
gst_buffer_extract (buf, 8, <ag, 4);
|
||||||
ltag = GUINT32_FROM_LE (ltag);
|
ltag = GUINT32_FROM_LE (ltag);
|
||||||
@ -1546,9 +1556,12 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
buf = NULL;
|
buf = NULL;
|
||||||
if (data_size > 0) {
|
if (data_size > 0) {
|
||||||
if ((res =
|
res =
|
||||||
gst_wavparse_pull_range_exact (wav, wav->offset,
|
gst_wavparse_pull_range_exact (wav, wav->offset,
|
||||||
data_size, &buf)) != GST_FLOW_OK)
|
data_size, &buf);
|
||||||
|
if (res == GST_FLOW_EOS)
|
||||||
|
break;
|
||||||
|
else if (res != GST_FLOW_OK)
|
||||||
goto header_pull_error;
|
goto header_pull_error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1586,9 +1599,12 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
buf = NULL;
|
buf = NULL;
|
||||||
wav->offset += 12;
|
wav->offset += 12;
|
||||||
if ((res =
|
res =
|
||||||
gst_wavparse_pull_range_exact (wav, wav->offset,
|
gst_wavparse_pull_range_exact (wav, wav->offset,
|
||||||
data_size, &buf)) != GST_FLOW_OK)
|
data_size, &buf);
|
||||||
|
if (res == GST_FLOW_EOS)
|
||||||
|
break;
|
||||||
|
else if (res != GST_FLOW_OK)
|
||||||
goto header_pull_error;
|
goto header_pull_error;
|
||||||
gst_buffer_map (buf, &map, GST_MAP_READ);
|
gst_buffer_map (buf, &map, GST_MAP_READ);
|
||||||
gst_wavparse_adtl_chunk (wav, (const guint8 *) map.data,
|
gst_wavparse_adtl_chunk (wav, (const guint8 *) map.data,
|
||||||
@ -1632,9 +1648,11 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
wav->offset += 8;
|
wav->offset += 8;
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
buf = NULL;
|
buf = NULL;
|
||||||
if ((res =
|
res =
|
||||||
gst_wavparse_pull_range_exact (wav, wav->offset,
|
gst_wavparse_pull_range_exact (wav, wav->offset, data_size, &buf);
|
||||||
data_size, &buf)) != GST_FLOW_OK)
|
if (res == GST_FLOW_EOS)
|
||||||
|
break;
|
||||||
|
else if (res != GST_FLOW_OK)
|
||||||
goto header_pull_error;
|
goto header_pull_error;
|
||||||
gst_buffer_map (buf, &map, GST_MAP_READ);
|
gst_buffer_map (buf, &map, GST_MAP_READ);
|
||||||
if (!gst_wavparse_cue_chunk (wav, (const guint8 *) map.data,
|
if (!gst_wavparse_cue_chunk (wav, (const guint8 *) map.data,
|
||||||
@ -1676,9 +1694,11 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
wav->offset += 8;
|
wav->offset += 8;
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
buf = NULL;
|
buf = NULL;
|
||||||
if ((res =
|
res =
|
||||||
gst_wavparse_pull_range_exact (wav, wav->offset,
|
gst_wavparse_pull_range_exact (wav, wav->offset, data_size, &buf);
|
||||||
data_size, &buf)) != GST_FLOW_OK)
|
if (res == GST_FLOW_EOS)
|
||||||
|
break;
|
||||||
|
else if (res != GST_FLOW_OK)
|
||||||
goto header_pull_error;
|
goto header_pull_error;
|
||||||
gst_buffer_map (buf, &map, GST_MAP_READ);
|
gst_buffer_map (buf, &map, GST_MAP_READ);
|
||||||
if (!gst_wavparse_smpl_chunk (wav, (const guint8 *) map.data,
|
if (!gst_wavparse_smpl_chunk (wav, (const guint8 *) map.data,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user