mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
gst/udp/: Avoid leaking internally allocated file descriptors when setting custom file descriptors. Fixes #543101.
Original commit message from CVS: Patch by: Peter Kjellerstedt <pkj at axis com> * gst/udp/gstdynudpsink.c: (gst_dynudpsink_init), (gst_dynudpsink_finalize), (gst_dynudpsink_set_property), (gst_dynudpsink_init_send), (gst_dynudpsink_close): * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init), (gst_multiudpsink_finalize), (gst_multiudpsink_set_property): * gst/udp/gstudpsrc.c: (gst_udpsrc_finalize), (gst_udpsrc_set_property): Avoid leaking internally allocated file descriptors when setting custom file descriptors. Fixes #543101.
This commit is contained in:
parent
0dfa54f450
commit
7431491470
4 changed files with 67 additions and 23 deletions
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
|||
2008-08-20 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||
|
||||
Patch by: Peter Kjellerstedt <pkj at axis com>
|
||||
|
||||
* gst/udp/gstdynudpsink.c: (gst_dynudpsink_init),
|
||||
(gst_dynudpsink_finalize), (gst_dynudpsink_set_property),
|
||||
(gst_dynudpsink_init_send), (gst_dynudpsink_close):
|
||||
* gst/udp/gstmultiudpsink.c: (gst_multiudpsink_init),
|
||||
(gst_multiudpsink_finalize), (gst_multiudpsink_set_property):
|
||||
* gst/udp/gstudpsrc.c: (gst_udpsrc_finalize),
|
||||
(gst_udpsrc_set_property):
|
||||
Avoid leaking internally allocated file descriptors when setting
|
||||
custom file descriptors. Fixes #543101.
|
||||
|
||||
2008-08-20 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||
|
||||
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_stream_configure_udp_sink):
|
||||
|
|
|
@ -41,11 +41,6 @@
|
|||
GST_DEBUG_CATEGORY_STATIC (dynudpsink_debug);
|
||||
#define GST_CAT_DEFAULT (dynudpsink_debug)
|
||||
|
||||
#define CLOSE_IF_REQUESTED(udpctx) \
|
||||
if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) \
|
||||
CLOSE_SOCKET(udpctx->sock); \
|
||||
udpctx->sock = -1;
|
||||
|
||||
static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
|
@ -80,6 +75,16 @@ enum
|
|||
PROP_CLOSEFD
|
||||
};
|
||||
|
||||
#define CLOSE_IF_REQUESTED(udpctx) \
|
||||
G_STMT_START { \
|
||||
if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) { \
|
||||
CLOSE_SOCKET(udpctx->sock); \
|
||||
if (udpctx->sock == udpctx->sockfd) \
|
||||
udpctx->sockfd = UDP_DEFAULT_SOCKFD; \
|
||||
} \
|
||||
udpctx->sock = -1; \
|
||||
} G_STMT_END
|
||||
|
||||
static void gst_dynudpsink_base_init (gpointer g_class);
|
||||
static void gst_dynudpsink_class_init (GstDynUDPSink * klass);
|
||||
static void gst_dynudpsink_init (GstDynUDPSink * udpsink);
|
||||
|
@ -179,12 +184,8 @@ gst_dynudpsink_class_init (GstDynUDPSink * klass)
|
|||
static void
|
||||
gst_dynudpsink_init (GstDynUDPSink * sink)
|
||||
{
|
||||
GstDynUDPSink *udpsink;
|
||||
|
||||
WSA_STARTUP (sink);
|
||||
|
||||
udpsink = GST_DYNUDPSINK (sink);
|
||||
|
||||
sink->sockfd = UDP_DEFAULT_SOCKFD;
|
||||
sink->closefd = UDP_DEFAULT_CLOSEFD;
|
||||
sink->externalfd = FALSE;
|
||||
|
@ -195,6 +196,13 @@ gst_dynudpsink_init (GstDynUDPSink * sink)
|
|||
static void
|
||||
gst_dynudpsink_finalize (GObject * object)
|
||||
{
|
||||
GstDynUDPSink *udpsink;
|
||||
|
||||
udpsink = GST_DYNUDPSINK (object);
|
||||
|
||||
if (udpsink->sockfd >= 0 && udpsink->closefd)
|
||||
CLOSE_SOCKET (udpsink->sockfd);
|
||||
|
||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
|
||||
WSA_CLEANUP (object);
|
||||
|
@ -265,6 +273,9 @@ gst_dynudpsink_set_property (GObject * object, guint prop_id,
|
|||
|
||||
switch (prop_id) {
|
||||
case PROP_SOCKFD:
|
||||
if (udpsink->sockfd >= 0 && udpsink->sockfd != udpsink->sock &&
|
||||
udpsink->closefd)
|
||||
CLOSE_SOCKET (udpsink->sockfd);
|
||||
udpsink->sockfd = g_value_get_int (value);
|
||||
GST_DEBUG ("setting SOCKFD to %d", udpsink->sockfd);
|
||||
break;
|
||||
|
@ -309,7 +320,7 @@ gst_dynudpsink_init_send (GstDynUDPSink * sink)
|
|||
|
||||
if (sink->sockfd == -1) {
|
||||
/* create sender socket if none available */
|
||||
if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
|
||||
if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) < 0)
|
||||
goto no_socket;
|
||||
|
||||
bc_val = 1;
|
||||
|
@ -348,8 +359,7 @@ gst_dynudpsink_get_stats (GstDynUDPSink * sink, const gchar * host, gint port)
|
|||
static void
|
||||
gst_dynudpsink_close (GstDynUDPSink * sink)
|
||||
{
|
||||
if (sink->sock != -1)
|
||||
CLOSE_IF_REQUESTED (sink);
|
||||
CLOSE_IF_REQUESTED (sink);
|
||||
}
|
||||
|
||||
static GstStateChangeReturn
|
||||
|
|
|
@ -105,9 +105,14 @@ enum
|
|||
};
|
||||
|
||||
#define CLOSE_IF_REQUESTED(udpctx) \
|
||||
if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) \
|
||||
G_STMT_START { \
|
||||
if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) { \
|
||||
CLOSE_SOCKET(udpctx->sock); \
|
||||
udpctx->sock = -1;
|
||||
if (udpctx->sock == udpctx->sockfd) \
|
||||
udpctx->sockfd = DEFAULT_SOCKFD; \
|
||||
} \
|
||||
udpctx->sock = DEFAULT_SOCK; \
|
||||
} G_STMT_END
|
||||
|
||||
static void gst_multiudpsink_base_init (gpointer g_class);
|
||||
static void gst_multiudpsink_class_init (GstMultiUDPSinkClass * klass);
|
||||
|
@ -332,7 +337,7 @@ gst_multiudpsink_init (GstMultiUDPSink * sink)
|
|||
WSA_STARTUP (sink);
|
||||
|
||||
sink->client_lock = g_mutex_new ();
|
||||
sink->sock = -1;
|
||||
sink->sock = DEFAULT_SOCK;
|
||||
sink->sockfd = DEFAULT_SOCKFD;
|
||||
sink->closefd = DEFAULT_CLOSEFD;
|
||||
sink->externalfd = (sink->sockfd != -1);
|
||||
|
@ -352,6 +357,9 @@ gst_multiudpsink_finalize (GObject * object)
|
|||
g_list_foreach (sink->clients, (GFunc) free_client, NULL);
|
||||
g_list_free (sink->clients);
|
||||
|
||||
if (sink->sockfd >= 0 && sink->closefd)
|
||||
CLOSE_SOCKET (sink->sockfd);
|
||||
|
||||
g_mutex_free (sink->client_lock);
|
||||
|
||||
WSA_CLEANUP (object);
|
||||
|
@ -517,6 +525,9 @@ gst_multiudpsink_set_property (GObject * object, guint prop_id,
|
|||
|
||||
switch (prop_id) {
|
||||
case PROP_SOCKFD:
|
||||
if (udpsink->sockfd >= 0 && udpsink->sockfd != udpsink->sock &&
|
||||
udpsink->closefd)
|
||||
CLOSE_SOCKET (udpsink->sockfd);
|
||||
udpsink->sockfd = g_value_get_int (value);
|
||||
GST_DEBUG_OBJECT (udpsink, "setting SOCKFD to %d", udpsink->sockfd);
|
||||
break;
|
||||
|
|
|
@ -141,13 +141,6 @@ typedef int socklen_t;
|
|||
GST_DEBUG_CATEGORY_STATIC (udpsrc_debug);
|
||||
#define GST_CAT_DEFAULT (udpsrc_debug)
|
||||
|
||||
#define CLOSE_IF_REQUESTED(udpctx) \
|
||||
G_STMT_START { \
|
||||
if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) \
|
||||
CLOSE_SOCKET(udpctx->sock.fd); \
|
||||
udpctx->sock.fd = -1; \
|
||||
} G_STMT_END
|
||||
|
||||
static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
|
@ -191,6 +184,16 @@ enum
|
|||
PROP_LAST
|
||||
};
|
||||
|
||||
#define CLOSE_IF_REQUESTED(udpctx) \
|
||||
G_STMT_START { \
|
||||
if ((!udpctx->externalfd) || (udpctx->externalfd && udpctx->closefd)) { \
|
||||
CLOSE_SOCKET(udpctx->sock.fd); \
|
||||
if (udpctx->sock.fd == udpctx->sockfd) \
|
||||
udpctx->sockfd = UDP_DEFAULT_SOCKFD; \
|
||||
} \
|
||||
udpctx->sock.fd = UDP_DEFAULT_SOCK; \
|
||||
} G_STMT_END
|
||||
|
||||
static void gst_udpsrc_uri_handler_init (gpointer g_iface, gpointer iface_data);
|
||||
|
||||
static GstCaps *gst_udpsrc_getcaps (GstBaseSrc * src);
|
||||
|
@ -348,7 +351,10 @@ gst_udpsrc_finalize (GObject * object)
|
|||
g_free (udpsrc->multi_group);
|
||||
g_free (udpsrc->uri);
|
||||
|
||||
WSA_CLEANUP (src);
|
||||
if (udpsrc->sockfd >= 0 && udpsrc->closefd)
|
||||
CLOSE_SOCKET (udpsrc->sockfd);
|
||||
|
||||
WSA_CLEANUP (object);
|
||||
|
||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
}
|
||||
|
@ -671,6 +677,9 @@ gst_udpsrc_set_property (GObject * object, guint prop_id, const GValue * value,
|
|||
break;
|
||||
}
|
||||
case PROP_SOCKFD:
|
||||
if (udpsrc->sockfd >= 0 && udpsrc->sockfd != udpsrc->sock.fd &&
|
||||
udpsrc->closefd)
|
||||
CLOSE_SOCKET (udpsrc->sockfd);
|
||||
udpsrc->sockfd = g_value_get_int (value);
|
||||
GST_DEBUG ("setting SOCKFD to %d", udpsrc->sockfd);
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue