audio-buffer: Don't fail to map buffers with zero samples
authorSebastian Dröge <sebastian@centricular.com>
Thu, 14 Nov 2019 11:37:58 +0000 (12:37 +0100)
committerTim-Philipp Müller <tim@centricular.com>
Thu, 14 Nov 2019 20:48:32 +0000 (20:48 +0000)
Instead initialize the map infos, etc to NULL like gst_buffer_map()
would be doing on a zero-sized buffer.

This fixes a crash in audioresample if the first output buffer would
contain zero samples.

gst-libs/gst/audio/audio-buffer.c

index 74b04c7..e016572 100644 (file)
@@ -154,16 +154,22 @@ gst_audio_buffer_map (GstAudioBuffer * buffer, const GstAudioInfo * info,
       buffer->map_infos = buffer->priv_map_infos_arr;
     }
 
-    for (i = 0; i < buffer->n_planes; i++) {
-      if (!gst_buffer_find_memory (gstbuffer, meta->offsets[i],
-              GST_AUDIO_BUFFER_PLANE_SIZE (buffer), &idx, &length, &skip))
-        goto no_memory;
+    if (buffer->n_samples == 0) {
+      memset (buffer->map_infos, 0,
+          buffer->n_planes * sizeof (buffer->map_infos[0]));
+      memset (buffer->planes, 0, buffer->n_planes * sizeof (buffer->planes[0]));
+    } else {
+      for (i = 0; i < buffer->n_planes; i++) {
+        if (!gst_buffer_find_memory (gstbuffer, meta->offsets[i],
+                GST_AUDIO_BUFFER_PLANE_SIZE (buffer), &idx, &length, &skip))
+          goto no_memory;
 
-      if (!gst_buffer_map_range (gstbuffer, idx, length, &buffer->map_infos[i],
-              flags))
-        goto cannot_map;
+        if (!gst_buffer_map_range (gstbuffer, idx, length,
+                &buffer->map_infos[i], flags))
+          goto cannot_map;
 
-      buffer->planes[i] = buffer->map_infos[i].data + skip;
+        buffer->planes[i] = buffer->map_infos[i].data + skip;
+      }
     }
   }