Commit a60014f1 authored by Dan Winship's avatar Dan Winship

GInetSocketAddress: fix the byte order of flowinfo and scope_id

The flowinfo and scope_id fields of struct sockaddr_in6 are in host
byte order, but the code previously assumed they were in network byte
order. Fix that.

This is an ABI-breaking change (since before you would have had to use
g_ntohl() and g_htonl() with them to get the correct values, and now
that would give the wrong values), but the previous behavior was
clearly wrong, and no one ever reported it, so it is likely that no
one was actually using it.

https://bugzilla.gnome.org/show_bug.cgi?id=684404
parent 0ea7abae
......@@ -86,6 +86,12 @@ Notes about GLib 2.36
As of this version, the HOME variable is used if it is set and the
value from /etc/passwd is only used as a fallback.
* The 'flowinfo' and 'scope_id' fields of GInetSocketAddress
(introduced in GLib 2.32) have been fixed to be in host byte order
rather than network byte order. This is an incompatible change, but
the previous behavior was clearly broken, so it seems unlikely that
anyone was using it.
Notes about GLib 2.34
=====================
......
......@@ -227,8 +227,8 @@ g_inet_socket_address_to_native (GSocketAddress *address,
memset (sock, 0, sizeof (*sock));
sock->sin6_family = AF_INET6;
sock->sin6_port = g_htons (addr->priv->port);
sock->sin6_flowinfo = g_htonl (addr->priv->flowinfo);
sock->sin6_scope_id = g_htonl (addr->priv->scope_id);
sock->sin6_flowinfo = addr->priv->flowinfo;
sock->sin6_scope_id = addr->priv->scope_id;
memcpy (&(sock->sin6_addr.s6_addr), g_inet_address_to_bytes (addr->priv->address), sizeof (sock->sin6_addr));
return TRUE;
}
......
......@@ -259,8 +259,8 @@ g_socket_address_new_from_native (gpointer native,
sockaddr = g_object_new (G_TYPE_INET_SOCKET_ADDRESS,
"address", iaddr,
"port", g_ntohs (addr->sin6_port),
"flowinfo", g_ntohl (addr->sin6_flowinfo),
"scope_id", g_ntohl (addr->sin6_scope_id),
"flowinfo", addr->sin6_flowinfo,
"scope_id", addr->sin6_scope_id,
NULL);
g_object_unref (iaddr);
return sockaddr;
......
......@@ -657,8 +657,8 @@ test_sockaddr (void)
sin6.sin6_family = AF_INET6;
sin6.sin6_addr = in6addr_loopback;
sin6.sin6_port = g_htons (42);
sin6.sin6_scope_id = g_htonl (17);
sin6.sin6_flowinfo = g_htonl (1729);
sin6.sin6_scope_id = 17;
sin6.sin6_flowinfo = 1729;
saddr = g_socket_address_new_from_native (&sin6, sizeof (sin6));
g_assert (G_IS_INET_SOCKET_ADDRESS (saddr));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment