diff --git a/gio/gsocket.c b/gio/gsocket.c index b4a941e..7f41ffd 100644 --- a/gio/gsocket.c +++ b/gio/gsocket.c @@ -80,6 +80,8 @@ #include "gwin32networking.h" #endif +#include "gstrfuncsprivate.h" + /** * SECTION:gsocket * @short_description: Low-level socket object @@ -173,7 +175,7 @@ static gboolean g_socket_datagram_based_condition_wait (GDatagramBased GError **error); static GSocketAddress * -cache_recv_address (GSocket *socket, struct sockaddr *native, int native_len); +cache_recv_address (GSocket *socket, struct sockaddr *native, size_t native_len); static gssize g_socket_receive_message_with_timeout (GSocket *socket, @@ -270,7 +272,7 @@ struct _GSocketPrivate struct { GSocketAddress *addr; struct sockaddr *native; - gint native_len; + gsize native_len; guint64 last_used; } recv_addr_cache[RECV_ADDR_CACHE_SIZE]; }; @@ -5018,14 +5020,14 @@ g_socket_send_messages_with_timeout (GSocket *socket, } static GSocketAddress * -cache_recv_address (GSocket *socket, struct sockaddr *native, int native_len) +cache_recv_address (GSocket *socket, struct sockaddr *native, size_t native_len) { GSocketAddress *saddr; gint i; guint64 oldest_time = G_MAXUINT64; gint oldest_index = 0; - if (native_len <= 0) + if (native_len == 0) return NULL; saddr = NULL; @@ -5033,7 +5035,7 @@ cache_recv_address (GSocket *socket, struct sockaddr *native, int native_len) { GSocketAddress *tmp = socket->priv->recv_addr_cache[i].addr; gpointer tmp_native = socket->priv->recv_addr_cache[i].native; - gint tmp_native_len = socket->priv->recv_addr_cache[i].native_len; + gsize tmp_native_len = socket->priv->recv_addr_cache[i].native_len; if (!tmp) continue; @@ -5063,7 +5065,7 @@ cache_recv_address (GSocket *socket, struct sockaddr *native, int native_len) g_free (socket->priv->recv_addr_cache[oldest_index].native); } - socket->priv->recv_addr_cache[oldest_index].native = g_memdup (native, native_len); + socket->priv->recv_addr_cache[oldest_index].native = g_memdup2 (native, native_len); socket->priv->recv_addr_cache[oldest_index].native_len = native_len; socket->priv->recv_addr_cache[oldest_index].addr = g_object_ref (saddr); socket->priv->recv_addr_cache[oldest_index].last_used = g_get_monotonic_time (); @@ -5213,6 +5215,9 @@ g_socket_receive_message_with_timeout (GSocket *socket, { win32_unset_event_mask (socket, FD_READ); + /* addrlen has to be of type int because that’s how WSARecvFrom() is defined */ + G_STATIC_ASSERT (sizeof addr <= G_MAXINT); + addrlen = sizeof addr; if (address) result = WSARecvFrom (socket->priv->fd,