From 177f2772cf03d6e698d7fe5e8654ee8b81e7c444 Mon Sep 17 00:00:00 2001 From: Jens Georg Date: Mon, 27 Jun 2011 17:13:34 +0200 Subject: [PATCH] Do not send M-SEARCH/NOTIFY from port 1900 This fixes bgo#653380 and DLNA requirement 7.2.3.4. --- libgssdp/gssdp-client.c | 57 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/libgssdp/gssdp-client.c b/libgssdp/gssdp-client.c index 88f163a..695b380 100644 --- a/libgssdp/gssdp-client.c +++ b/libgssdp/gssdp-client.c @@ -92,6 +92,7 @@ struct _GSSDPClientPrivate { char *host_ip; char *network; + GSocket *send_socket; GSSDPSocketSource *request_socket; GSSDPSocketSource *multicast_socket; @@ -212,10 +213,53 @@ gssdp_client_initable_init (GInitable *initable, client); } + /* Setup send socket. For security reasons, it is not recommended to + * send with source port == SSDP_PORT */ + client->priv->send_socket = g_socket_new (G_SOCKET_FAMILY_IPV4, + G_SOCKET_TYPE_DATAGRAM, + G_SOCKET_PROTOCOL_UDP, + &internal_error); + if (client->priv->send_socket) { + GInetAddress *inet_addr; + GSocketAddress *sock_addr; + + inet_addr = g_inet_address_new_from_string + (gssdp_client_get_host_ip (client)); + sock_addr = g_inet_socket_address_new (inet_addr, 0); + + g_socket_bind (client->priv->send_socket, + sock_addr, + FALSE, + &internal_error); + + g_object_unref (sock_addr); + g_object_unref (inet_addr); + } + errors: - if (!client->priv->request_socket || !client->priv->multicast_socket) { + if (!client->priv->request_socket || + !client->priv->multicast_socket || + !client->priv->send_socket) { g_propagate_error (error, internal_error); + if (client->priv->request_socket) { + g_object_unref (client->priv->request_socket); + + client->priv->request_socket = NULL; + } + + if (client->priv->multicast_socket) { + g_object_unref (client->priv->multicast_socket); + + client->priv->multicast_socket = NULL; + } + + if (client->priv->send_socket) { + g_object_unref (client->priv->send_socket); + + client->priv->send_socket = NULL; + } + return FALSE; } @@ -323,6 +367,11 @@ gssdp_client_dispose (GObject *object) client->priv->multicast_socket = NULL; } + if (client->priv->send_socket) { + g_object_unref (client->priv->send_socket); + client->priv->send_socket = NULL; + } + /* Unref the context */ if (client->priv->main_context) { g_main_context_unref (client->priv->main_context); @@ -694,12 +743,12 @@ _gssdp_client_send_message (GSSDPClient *client, { gssize res; GError *error = NULL; - GSocket *socket = NULL; GInetAddress *inet_address = NULL; GSocketAddress *address = NULL; g_return_if_fail (GSSDP_IS_CLIENT (client)); g_return_if_fail (message != NULL); + g_return_if_fail (client->priv->send_socket != NULL); if (!client->priv->active) /* We don't send messages in passive mode */ @@ -715,8 +764,8 @@ _gssdp_client_send_message (GSSDPClient *client, inet_address = g_inet_address_new_from_string (dest_ip); address = g_inet_socket_address_new (inet_address, dest_port); - socket = gssdp_socket_source_get_socket (client->priv->request_socket); - res = g_socket_send_to (socket, + + res = g_socket_send_to (client->priv->send_socket, address, message, strlen (message), -- 2.7.4