mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 10:11:08 +00:00
mssdemux: fix segfault when trying to access codec_data
Check if codec_data was obtained before trying to use it to prevent a segfault
This commit is contained in:
parent
5948a07324
commit
628461b4d1
1 changed files with 26 additions and 23 deletions
|
@ -627,32 +627,35 @@ _gst_mss_stream_audio_caps_from_qualitylevel_xml (GstMssStreamQuality * q)
|
||||||
if (!codec_data) {
|
if (!codec_data) {
|
||||||
gint codec_data_len;
|
gint codec_data_len;
|
||||||
codec_data_str = (gchar *) xmlGetProp (node, (xmlChar *) "WaveFormatEx");
|
codec_data_str = (gchar *) xmlGetProp (node, (xmlChar *) "WaveFormatEx");
|
||||||
codec_data_len = strlen (codec_data_str) / 2;
|
|
||||||
|
|
||||||
/* a WAVEFORMATEX structure is 18 bytes */
|
if (codec_data_str != NULL) {
|
||||||
if (codec_data_str && codec_data_len >= 18) {
|
codec_data_len = strlen (codec_data_str) / 2;
|
||||||
GstMapInfo mapinfo;
|
|
||||||
codec_data = gst_buffer_from_hex_string ((gchar *) codec_data_str);
|
|
||||||
|
|
||||||
/* since this is a WAVEFORMATEX, try to get the block_align and rate */
|
/* a WAVEFORMATEX structure is 18 bytes */
|
||||||
gst_buffer_map (codec_data, &mapinfo, GST_MAP_READ);
|
if (codec_data_str && codec_data_len >= 18) {
|
||||||
if (!channels_str) {
|
GstMapInfo mapinfo;
|
||||||
channels = GST_READ_UINT16_LE (mapinfo.data + 2);
|
codec_data = gst_buffer_from_hex_string ((gchar *) codec_data_str);
|
||||||
}
|
|
||||||
if (!rate_str) {
|
|
||||||
rate = GST_READ_UINT32_LE (mapinfo.data + 4);
|
|
||||||
}
|
|
||||||
if (!block_align) {
|
|
||||||
block_align = GST_READ_UINT16_LE (mapinfo.data + 12);
|
|
||||||
}
|
|
||||||
gst_buffer_unmap (codec_data, &mapinfo);
|
|
||||||
|
|
||||||
/* Consume all the WAVEFORMATEX structure, and pass only the rest of
|
/* since this is a WAVEFORMATEX, try to get the block_align and rate */
|
||||||
* the data as the codec private data */
|
gst_buffer_map (codec_data, &mapinfo, GST_MAP_READ);
|
||||||
gst_buffer_resize (codec_data, 18, -1);
|
if (!channels_str) {
|
||||||
} else {
|
channels = GST_READ_UINT16_LE (mapinfo.data + 2);
|
||||||
GST_WARNING ("Dropping WaveFormatEx: data is %d bytes, "
|
}
|
||||||
"but at least 18 bytes are expected", codec_data_len);
|
if (!rate_str) {
|
||||||
|
rate = GST_READ_UINT32_LE (mapinfo.data + 4);
|
||||||
|
}
|
||||||
|
if (!block_align) {
|
||||||
|
block_align = GST_READ_UINT16_LE (mapinfo.data + 12);
|
||||||
|
}
|
||||||
|
gst_buffer_unmap (codec_data, &mapinfo);
|
||||||
|
|
||||||
|
/* Consume all the WAVEFORMATEX structure, and pass only the rest of
|
||||||
|
* the data as the codec private data */
|
||||||
|
gst_buffer_resize (codec_data, 18, -1);
|
||||||
|
} else {
|
||||||
|
GST_WARNING ("Dropping WaveFormatEx: data is %d bytes, "
|
||||||
|
"but at least 18 bytes are expected", codec_data_len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue