summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--gst/rtsp/rtspconnection.c18
2 files changed, 21 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 072f235d..5d0bd94a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-06-19 Wim Taymans <wim@fluendo.com>
+
+ * gst/rtsp/rtspconnection.c: (rtsp_connection_connect),
+ (rtsp_connection_close), (rtsp_connection_free):
+ Use threadsafe inet_ntop to convert an ip number to a string.
+ Fixes #447961.
+ Don't leak fd (and ip) when freeing a connection without first closing
+ it.
+
2007-06-19 Jan Schmidt <thaytan@mad.scientist.com>
* configure.ac:
diff --git a/gst/rtsp/rtspconnection.c b/gst/rtsp/rtspconnection.c
index f96caf4d..36355318 100644
--- a/gst/rtsp/rtspconnection.c
+++ b/gst/rtsp/rtspconnection.c
@@ -175,7 +175,8 @@ rtsp_connection_connect (RTSPConnection * conn, GTimeVal * timeout)
struct sockaddr_in sa_in;
struct hostent *hostinfo;
char **addrs;
- gchar *ip;
+ const gchar *ip;
+ gchar ipbuf[INET_ADDRSTRLEN];
struct in_addr addr;
gint ret;
guint16 port;
@@ -207,7 +208,8 @@ rtsp_connection_connect (RTSPConnection * conn, GTimeVal * timeout)
goto not_ip; /* host not an IP host */
addrs = hostinfo->h_addr_list;
- ip = inet_ntoa (*(struct in_addr *) *addrs);
+ ip = inet_ntop (AF_INET, (struct in_addr *) addrs[0], ipbuf,
+ sizeof (ipbuf));
}
/* get the port from the url */
@@ -264,7 +266,7 @@ rtsp_connection_connect (RTSPConnection * conn, GTimeVal * timeout)
done:
conn->fd = fd;
- conn->ip = ip;
+ conn->ip = g_strdup (ip);
return RTSP_OK;
@@ -1000,6 +1002,9 @@ rtsp_connection_close (RTSPConnection * conn)
g_return_val_if_fail (conn != NULL, RTSP_EINVAL);
+ g_free (conn->ip);
+ conn->ip = NULL;
+
if (conn->fd != -1) {
res = CLOSE_SOCKET (conn->fd);
#ifdef G_OS_WIN32
@@ -1021,19 +1026,20 @@ sys_error:
RTSPResult
rtsp_connection_free (RTSPConnection * conn)
{
+ RTSPResult res;
+
g_return_val_if_fail (conn != NULL, RTSP_EINVAL);
#ifdef G_OS_WIN32
WSACleanup ();
#endif
-
+ res = rtsp_connection_close (conn);
g_timer_destroy (conn->timer);
g_free (conn->username);
g_free (conn->passwd);
-
g_free (conn);
- return RTSP_OK;
+ return res;
}
RTSPResult