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;
|
||||
|
||||
buf = NULL;
|
||||
if ((res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset, 8,
|
||||
&buf)) != GST_FLOW_OK)
|
||||
res = gst_wavparse_pull_range_exact (wav, wav->offset, 8, &buf);
|
||||
if (res == GST_FLOW_EOS) {
|
||||
gotdata = TRUE;
|
||||
break;
|
||||
} else if (res != GST_FLOW_OK) {
|
||||
goto header_pull_error;
|
||||
}
|
||||
gst_buffer_map (buf, &map, GST_MAP_READ);
|
||||
tag = GST_READ_UINT32_LE (map.data);
|
||||
size = GST_READ_UINT32_LE (map.data + 4);
|
||||
@ -1428,9 +1431,12 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
||||
} else {
|
||||
gst_buffer_unref (buf);
|
||||
buf = NULL;
|
||||
if ((res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset + 8,
|
||||
data_size, &buf)) != GST_FLOW_OK)
|
||||
res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset + 8,
|
||||
data_size, &buf);
|
||||
if (res == GST_FLOW_EOS)
|
||||
break;
|
||||
else if (res != GST_FLOW_OK)
|
||||
goto header_pull_error;
|
||||
gst_buffer_extract (buf, 0, &wav->fact, 4);
|
||||
wav->fact = GUINT32_FROM_LE (wav->fact);
|
||||
@ -1474,9 +1480,12 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
||||
GstMapInfo map;
|
||||
gst_buffer_unref (buf);
|
||||
buf = NULL;
|
||||
if ((res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset + 8, size,
|
||||
&buf)) != GST_FLOW_OK)
|
||||
res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset + 8, size, &buf);
|
||||
goto header_pull_error;
|
||||
if (res == GST_FLOW_EOS)
|
||||
break;
|
||||
else if (res != GST_FLOW_OK)
|
||||
goto header_pull_error;
|
||||
gst_buffer_map (buf, &map, GST_MAP_READ);
|
||||
tempo = GST_READ_FLOAT_LE (map.data + 20);
|
||||
@ -1517,9 +1526,10 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
||||
} else {
|
||||
gst_buffer_unref (buf);
|
||||
buf = NULL;
|
||||
if ((res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset, 12,
|
||||
&buf)) != GST_FLOW_OK)
|
||||
res = gst_wavparse_pull_range_exact (wav, wav->offset, 12, &buf);
|
||||
if (res == GST_FLOW_EOS)
|
||||
break;
|
||||
else if (res != GST_FLOW_OK)
|
||||
goto header_pull_error;
|
||||
gst_buffer_extract (buf, 8, <ag, 4);
|
||||
ltag = GUINT32_FROM_LE (ltag);
|
||||
@ -1546,9 +1556,12 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
||||
gst_buffer_unref (buf);
|
||||
buf = NULL;
|
||||
if (data_size > 0) {
|
||||
if ((res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset,
|
||||
data_size, &buf)) != GST_FLOW_OK)
|
||||
res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset,
|
||||
data_size, &buf);
|
||||
if (res == GST_FLOW_EOS)
|
||||
break;
|
||||
else if (res != GST_FLOW_OK)
|
||||
goto header_pull_error;
|
||||
}
|
||||
}
|
||||
@ -1586,9 +1599,12 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
||||
gst_buffer_unref (buf);
|
||||
buf = NULL;
|
||||
wav->offset += 12;
|
||||
if ((res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset,
|
||||
data_size, &buf)) != GST_FLOW_OK)
|
||||
res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset,
|
||||
data_size, &buf);
|
||||
if (res == GST_FLOW_EOS)
|
||||
break;
|
||||
else if (res != GST_FLOW_OK)
|
||||
goto header_pull_error;
|
||||
gst_buffer_map (buf, &map, GST_MAP_READ);
|
||||
gst_wavparse_adtl_chunk (wav, (const guint8 *) map.data,
|
||||
@ -1632,9 +1648,11 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
||||
wav->offset += 8;
|
||||
gst_buffer_unref (buf);
|
||||
buf = NULL;
|
||||
if ((res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset,
|
||||
data_size, &buf)) != GST_FLOW_OK)
|
||||
res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset, data_size, &buf);
|
||||
if (res == GST_FLOW_EOS)
|
||||
break;
|
||||
else if (res != GST_FLOW_OK)
|
||||
goto header_pull_error;
|
||||
gst_buffer_map (buf, &map, GST_MAP_READ);
|
||||
if (!gst_wavparse_cue_chunk (wav, (const guint8 *) map.data,
|
||||
@ -1676,9 +1694,11 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
||||
wav->offset += 8;
|
||||
gst_buffer_unref (buf);
|
||||
buf = NULL;
|
||||
if ((res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset,
|
||||
data_size, &buf)) != GST_FLOW_OK)
|
||||
res =
|
||||
gst_wavparse_pull_range_exact (wav, wav->offset, data_size, &buf);
|
||||
if (res == GST_FLOW_EOS)
|
||||
break;
|
||||
else if (res != GST_FLOW_OK)
|
||||
goto header_pull_error;
|
||||
gst_buffer_map (buf, &map, GST_MAP_READ);
|
||||
if (!gst_wavparse_smpl_chunk (wav, (const guint8 *) map.data,
|
||||
|
Loading…
x
Reference in New Issue
Block a user