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:
Sebastian Dröge 2025-05-09 10:49:20 +03:00 committed by GStreamer Marge Bot
parent a332a411b7
commit ba8fd35e72

View File

@ -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, &ltag, 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,