mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
flacparse: post proper error message and fix buffer leak on header parsing error
https://bugzilla.gnome.org/show_bug.cgi?id=684701
This commit is contained in:
parent
150bd97e96
commit
49cc719809
1 changed files with 28 additions and 15 deletions
|
@ -1504,6 +1504,7 @@ gst_flac_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame,
|
||||||
} else if (flacparse->state == GST_FLAC_PARSE_STATE_HEADERS) {
|
} else if (flacparse->state == GST_FLAC_PARSE_STATE_HEADERS) {
|
||||||
gboolean is_last = ((map.data[0] & 0x80) == 0x80);
|
gboolean is_last = ((map.data[0] & 0x80) == 0x80);
|
||||||
guint type = (map.data[0] & 0x7F);
|
guint type = (map.data[0] & 0x7F);
|
||||||
|
gboolean hdr_ok;
|
||||||
|
|
||||||
if (type == 127) {
|
if (type == 127) {
|
||||||
GST_WARNING_OBJECT (flacparse, "Invalid metadata block type");
|
GST_WARNING_OBJECT (flacparse, "Invalid metadata block type");
|
||||||
|
@ -1517,37 +1518,41 @@ gst_flac_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame,
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 0: /* STREAMINFO */
|
case 0: /* STREAMINFO */
|
||||||
if (!gst_flac_parse_handle_streaminfo (flacparse, sbuffer))
|
hdr_ok = gst_flac_parse_handle_streaminfo (flacparse, sbuffer);
|
||||||
goto cleanup;
|
|
||||||
break;
|
break;
|
||||||
case 3: /* SEEKTABLE */
|
case 3: /* SEEKTABLE */
|
||||||
if (!gst_flac_parse_handle_seektable (flacparse, sbuffer))
|
hdr_ok = gst_flac_parse_handle_seektable (flacparse, sbuffer);
|
||||||
goto cleanup;
|
|
||||||
break;
|
break;
|
||||||
case 4: /* VORBIS_COMMENT */
|
case 4: /* VORBIS_COMMENT */
|
||||||
if (!gst_flac_parse_handle_vorbiscomment (flacparse, sbuffer))
|
hdr_ok = gst_flac_parse_handle_vorbiscomment (flacparse, sbuffer);
|
||||||
goto cleanup;
|
|
||||||
break;
|
break;
|
||||||
case 5: /* CUESHEET */
|
case 5: /* CUESHEET */
|
||||||
if (!gst_flac_parse_handle_cuesheet (flacparse, sbuffer))
|
hdr_ok = gst_flac_parse_handle_cuesheet (flacparse, sbuffer);
|
||||||
goto cleanup;
|
|
||||||
break;
|
break;
|
||||||
case 6: /* PICTURE */
|
case 6: /* PICTURE */
|
||||||
if (!gst_flac_parse_handle_picture (flacparse, sbuffer))
|
hdr_ok = gst_flac_parse_handle_picture (flacparse, sbuffer);
|
||||||
goto cleanup;
|
|
||||||
break;
|
break;
|
||||||
case 1: /* PADDING */
|
case 1: /* PADDING */
|
||||||
case 2: /* APPLICATION */
|
case 2: /* APPLICATION */
|
||||||
default: /* RESERVED */
|
default: /* RESERVED */
|
||||||
|
hdr_ok = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_BUFFER_TIMESTAMP (sbuffer) = GST_CLOCK_TIME_NONE;
|
if (hdr_ok) {
|
||||||
GST_BUFFER_DURATION (sbuffer) = GST_CLOCK_TIME_NONE;
|
GST_BUFFER_TIMESTAMP (sbuffer) = GST_CLOCK_TIME_NONE;
|
||||||
GST_BUFFER_OFFSET (sbuffer) = 0;
|
GST_BUFFER_DURATION (sbuffer) = GST_CLOCK_TIME_NONE;
|
||||||
GST_BUFFER_OFFSET_END (sbuffer) = 0;
|
GST_BUFFER_OFFSET (sbuffer) = 0;
|
||||||
|
GST_BUFFER_OFFSET_END (sbuffer) = 0;
|
||||||
|
|
||||||
flacparse->headers = g_list_append (flacparse->headers, sbuffer);
|
flacparse->headers = g_list_append (flacparse->headers, sbuffer);
|
||||||
|
} else {
|
||||||
|
GST_WARNING_OBJECT (parse, "failed to parse header of type %u", type);
|
||||||
|
GST_MEMDUMP_OBJECT (parse, "bad header data", map.data, size);
|
||||||
|
|
||||||
|
gst_buffer_unref (sbuffer);
|
||||||
|
goto header_parsing_error;
|
||||||
|
}
|
||||||
|
|
||||||
if (is_last) {
|
if (is_last) {
|
||||||
if (!gst_flac_parse_handle_headers (flacparse))
|
if (!gst_flac_parse_handle_headers (flacparse))
|
||||||
|
@ -1643,6 +1648,14 @@ cleanup:
|
||||||
gst_buffer_unmap (buffer, &map);
|
gst_buffer_unmap (buffer, &map);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
|
/* ERRORS */
|
||||||
|
header_parsing_error:
|
||||||
|
{
|
||||||
|
GST_ELEMENT_ERROR (flacparse, STREAM, DECODE, (NULL),
|
||||||
|
("Failed to parse headers"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
|
|
Loading…
Reference in a new issue