mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-07-30 18:25:09 +00:00
If buffer lists with too many buffers would be written before, a stack overflow would happen because of memory linear with the number of GstMemory would be allocated on the stack. This could happen for example when filesink is configured with a very big buffer size. Instead now move the buffer and buffer list writing into the helper functions and at most write IOV_MAX memories at once. Anything bigger than that wouldn't be passed to writev() anyway and written differently in the previous code, so this also potentially speeds up writing for these cases. For example the following pipeline would crash with a stackoverflow: gst-launch-1.0 audiotestsrc ! filesink buffer-size=1073741824 location=/dev/null
60 lines
2.4 KiB
C
60 lines
2.4 KiB
C
/* GStreamer
|
|
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
|
* 2000 Wim Taymans <wtay@chello.be>
|
|
*
|
|
* gst_private.h: Private header for within libgst
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef __GST_ELEMENTS_PRIVATE_H__
|
|
#define __GST_ELEMENTS_PRIVATE_H__
|
|
|
|
#include "gst/gst.h"
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
G_GNUC_INTERNAL
|
|
gchar * gst_buffer_get_flags_string (GstBuffer *buffer);
|
|
|
|
G_GNUC_INTERNAL
|
|
gchar * gst_buffer_get_meta_string (GstBuffer * buffer);
|
|
|
|
G_GNUC_INTERNAL
|
|
GstFlowReturn gst_writev_buffer (GstObject * sink, gint fd, GstPoll * fdset,
|
|
GstBuffer * buffer,
|
|
guint64 * bytes_written, guint64 skip,
|
|
gint max_transient_error_timeout, guint64 current_position,
|
|
gboolean * flushing);
|
|
|
|
G_GNUC_INTERNAL
|
|
GstFlowReturn gst_writev_buffer_list (GstObject * sink, gint fd, GstPoll * fdset,
|
|
GstBufferList * buffer_list,
|
|
guint64 * bytes_written, guint64 skip,
|
|
gint max_transient_error_timeout, guint64 current_position,
|
|
gboolean * flushing);
|
|
|
|
G_GNUC_INTERNAL
|
|
GstFlowReturn gst_write_mem (GstObject * sink, gint fd, GstPoll * fdset,
|
|
const guint8 *data, guint size,
|
|
guint64 * bytes_written, guint64 skip,
|
|
gint max_transient_error_timeout, guint64 current_position,
|
|
gboolean * flushing);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __GST_ELEMENTS_PRIVATE_H__ */
|