summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2018-11-16 17:03:39 -0500
committerOlivier CrĂȘte <olivier.crete@collabora.com>2018-11-16 17:08:13 -0500
commit099aae60566dcae1ecfd9313f7cbfd1ac83608b0 (patch)
tree13459251e275c3172b64691afd181e030575b098
parent5496500b1535d9343fdac2a3408864643fe65d7e (diff)
downloadlibnice-lock-addr-cache-in-udp-sink.tar.gz
udp-bsd: Protect the GSocketAddress cache with a mutexlock-addr-cache-in-udp-sink
-rw-r--r--socket/udp-bsd.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/socket/udp-bsd.c b/socket/udp-bsd.c
index 70cd0ab..0fa8dd7 100644
--- a/socket/udp-bsd.c
+++ b/socket/udp-bsd.c
@@ -71,6 +71,9 @@ static void socket_set_writable_callback (NiceSocket *sock,
struct UdpBsdSocketPrivate
{
+ GMutex mutex;
+
+ /* protected by mutex */
NiceAddress niceaddr;
GSocketAddress *gaddr;
};
@@ -157,6 +160,8 @@ nice_udp_bsd_socket_new (NiceAddress *addr)
sock->set_writable_callback = socket_set_writable_callback;
sock->close = socket_close;
+ g_mutex_init (&priv->mutex);
+
return sock;
}
@@ -165,8 +170,8 @@ socket_close (NiceSocket *sock)
{
struct UdpBsdSocketPrivate *priv = sock->priv;
- if (priv->gaddr)
- g_object_unref (priv->gaddr);
+ g_clear_object (&priv->gaddr);
+ g_mutex_clear (&priv->mutex);
g_slice_free (struct UdpBsdSocketPrivate, sock->priv);
sock->priv = NULL;
@@ -247,34 +252,43 @@ socket_send_message (NiceSocket *sock, const NiceAddress *to,
struct UdpBsdSocketPrivate *priv = sock->priv;
GError *child_error = NULL;
gssize len;
+ GSocketAddress *gaddr = NULL;
/* Make sure socket has not been freed: */
g_assert (sock->priv != NULL);
+ g_mutex_lock (&priv->mutex);
if (!nice_address_is_valid (&priv->niceaddr) ||
!nice_address_equal (&priv->niceaddr, to)) {
union {
struct sockaddr_storage storage;
struct sockaddr addr;
} sa;
- GSocketAddress *gaddr;
- if (priv->gaddr)
- g_object_unref (priv->gaddr);
+ g_clear_object (&priv->gaddr);
nice_address_copy_to_sockaddr (to, &sa.addr);
gaddr = g_socket_address_new_from_native (&sa.addr, sizeof(sa));
- priv->gaddr = gaddr;
+ if (gaddr)
+ priv->gaddr = g_object_ref (gaddr);
- if (gaddr == NULL)
+ if (gaddr == NULL) {
+ g_mutex_unlock (&priv->mutex);
return -1;
+ }
priv->niceaddr = *to;
+ } else {
+ if (priv->gaddr)
+ gaddr = g_object_ref (priv->gaddr);
}
+ g_mutex_unlock (&priv->mutex);
- len = g_socket_send_message (sock->fileno, priv->gaddr, message->buffers,
+ len = g_socket_send_message (sock->fileno, gaddr, message->buffers,
message->n_buffers, NULL, 0, G_SOCKET_MSG_NONE, NULL, &child_error);
+ g_clear_object (&gaddr);
+
if (len < 0) {
if (g_error_matches (child_error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
len = 0;