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:
Thiago Santos 2013-12-17 17:55:58 -03:00
parent 5948a07324
commit 628461b4d1

View file

@ -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);
}
} }
} }