Fix various strict aliasing problems with sockaddr

Fix various strict aliasing problems caused by casting between (struct
sockaddr *) and (struct sockaddr_storage *): the correct code here is to
keep the two in a union.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

https://bugzilla.gnome.org/show_bug.cgi?id=791622
This commit is contained in:
Philip Withnall
2017-12-21 17:46:24 +00:00
parent 8f7cc8cb75
commit d8fe926ba4
3 changed files with 47 additions and 26 deletions

View File

@@ -47,7 +47,10 @@
struct _GNativeSocketAddressPrivate
{
struct sockaddr *sockaddr;
struct sockaddr_storage storage;
union {
struct sockaddr_storage storage;
struct sockaddr sa;
} storage;
gsize sockaddr_len;
};
@@ -58,7 +61,7 @@ g_native_socket_address_dispose (GObject *object)
{
GNativeSocketAddress *address = G_NATIVE_SOCKET_ADDRESS (object);
if (address->priv->sockaddr != (struct sockaddr *)&address->priv->storage)
if (address->priv->sockaddr != &address->priv->storage.sa)
g_free (address->priv->sockaddr);
G_OBJECT_CLASS (g_native_socket_address_parent_class)->dispose (object);
@@ -150,7 +153,7 @@ g_native_socket_address_new (gpointer native,
addr = g_object_new (G_TYPE_NATIVE_SOCKET_ADDRESS, NULL);
if (len <= sizeof(addr->priv->storage))
addr->priv->sockaddr = (struct sockaddr*)&addr->priv->storage;
addr->priv->sockaddr = &addr->priv->storage.sa;
else
addr->priv->sockaddr = g_malloc (len);