--- a/libpurple/ciphers/aescipher.c Thu Apr 03 09:26:19 2014 +0530
+++ b/libpurple/ciphers/aescipher.c Thu Apr 03 13:31:04 2014 +0200
@@ -483,8 +483,9 @@
input_padded = purple_aes_cipher_pad_pkcs7(input, in_len, &out_len);
if (out_len > out_size) {
- purple_debug_error("cipher-aes",
- "Output buffer too small (%d > %d)", out_len, out_size);
+ purple_debug_error("cipher-aes", "Output buffer too small (%" + G_GSIZE_FORMAT " > %" G_GSIZE_FORMAT ")", memset(input_padded, 0, out_len);
--- a/libpurple/network.c Thu Apr 03 09:26:19 2014 +0530
+++ b/libpurple/network.c Thu Apr 03 13:31:04 2014 +0200
@@ -140,9 +140,9 @@
purple_network_get_local_system_ip(int fd)
+ struct ifreq buffer[100];
struct sockaddr_in *sinptr;
@@ -154,21 +154,26 @@
source = socket(PF_INET,SOCK_STREAM, 0);
ifc.ifc_len = sizeof(buffer);
- ifc.ifc_req = (struct ifreq *)buffer;
ioctl(source, SIOCGIFCONF, &ifc);
- while (tmp < buffer + ifc.ifc_len)
- ifr = (struct ifreq *)tmp;
- tmp += HX_SIZE_OF_IFREQ(*ifr);
+ it_end = it + ifc.ifc_len; + /* in this case "it" is: + * a) (struct ifreq)-aligned + * b) not aligned, because of OS quirks (see + * _SIZEOF_ADDR_IFREQ), so the OS should deal with it. + ifr = (struct ifreq *)(gpointer)it; + it += HX_SIZE_OF_IFREQ(*ifr); if (ifr->ifr_addr.sa_family == AF_INET)
- sinptr = (struct sockaddr_in *)&ifr->ifr_addr;
+ sinptr = (struct sockaddr_in *)(gpointer)&ifr->ifr_addr; if (sinptr->sin_addr.s_addr != lhost)
add = ntohl(sinptr->sin_addr.s_addr);
@@ -205,21 +210,22 @@
int family = ifa->ifa_addr ? ifa->ifa_addr->sa_family : AF_UNSPEC;
char host[INET6_ADDRSTRLEN];
+ common_sockaddr_t *addr = + (common_sockaddr_t *)(gpointer)ifa->ifa_addr; if ((family != AF_INET && family != AF_INET6) || ifa->ifa_flags & IFF_LOOPBACK)
- tmp = inet_ntop(family, &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr, host, sizeof(host));
+ tmp = inet_ntop(family, &addr->in.sin_addr, host, sizeof(host)); - struct sockaddr_in6 *sockaddr = (struct sockaddr_in6 *)ifa->ifa_addr;
/* Peer-peer link-local communication is a big TODO. I am not sure
* how communicating link-local addresses is supposed to work, and
* it seems like it would require attempting the cartesian product
* of the local and remote interfaces to see if any match (eww).
- if (!IN6_IS_ADDR_LINKLOCAL(&sockaddr->sin6_addr))
- tmp = inet_ntop(family, &sockaddr->sin6_addr, host, sizeof(host));
+ if (!IN6_IS_ADDR_LINKLOCAL(&addr->in6.sin6_addr)) + tmp = inet_ntop(family, &addr->in6.sin6_addr, host, sizeof(host)); result = g_list_prepend(result, g_strdup(tmp));
@@ -231,25 +237,28 @@
#else /* HAVE_GETIFADDRS && HAVE_INET_NTOP */
int source = socket(PF_INET,SOCK_STREAM, 0);
+ struct ifreq buffer[100]; ifc.ifc_len = sizeof(buffer);
- ifc.ifc_req = (struct ifreq *)buffer;
ioctl(source, SIOCGIFCONF, &ifc);
- while (tmp < buffer + ifc.ifc_len) {
+ it_end = it + ifc.ifc_len; char dst[INET_ADDRSTRLEN];
- ifr = (struct ifreq *)tmp;
- tmp += HX_SIZE_OF_IFREQ(*ifr);
+ /* alignment: see purple_network_get_local_system_ip */ + ifr = (struct ifreq *)(gpointer)it; + it += HX_SIZE_OF_IFREQ(*ifr); if (ifr->ifr_addr.sa_family == AF_INET) {
- struct sockaddr_in *sinptr = (struct sockaddr_in *)&ifr->ifr_addr;
+ struct sockaddr_in *sinptr = + (struct sockaddr_in *)(gpointer)&ifr->ifr_addr; inet_ntop(AF_INET, &sinptr->sin_addr, dst,
@@ -986,14 +995,14 @@
if (hosts && g_slist_next(hosts)) {
- struct sockaddr *addr = g_slist_next(hosts)->data;
+ common_sockaddr_t *addr = g_slist_next(hosts)->data; char dst[INET6_ADDRSTRLEN];
- if (addr->sa_family == AF_INET6) {
- inet_ntop(addr->sa_family, &((struct sockaddr_in6 *) addr)->sin6_addr,
+ if (addr->sa.sa_family == AF_INET6) { + inet_ntop(addr->sa.sa_family, &addr->in6.sin6_addr, - inet_ntop(addr->sa_family, &((struct sockaddr_in *) addr)->sin_addr,
+ inet_ntop(addr->sa.sa_family, &addr->in.sin_addr, --- a/libpurple/ntlm.c Thu Apr 03 09:26:19 2014 +0530
+++ b/libpurple/ntlm.c Thu Apr 03 13:31:04 2014 +0200
@@ -121,7 +121,7 @@
host_off = sizeof(struct type1_message);
dom_off = sizeof(struct type1_message) + hostnamelen;
msg = g_malloc0(sizeof(struct type1_message) + hostnamelen + domainlen);
- tmsg = (struct type1_message*)msg;
+ tmsg = (struct type1_message*)(gpointer)msg; @@ -149,19 +149,22 @@
purple_ntlm_parse_type2(const gchar *type2, guint32 *flags)
- struct type2_message *tmsg;
+ struct type2_message tmsg; - tmsg = (struct type2_message*)purple_base64_decode(type2, &retlen);
- if (tmsg != NULL && retlen >= (sizeof(struct type2_message) - 1)) {
- memcpy(nonce, tmsg->nonce, 8);
+ buff = purple_base64_decode(type2, &retlen); + if (buff != NULL && retlen >= (sizeof(struct type2_message) - 1)) { + memcpy(&tmsg, buff, MIN(retlen, sizeof(tmsg))); + memcpy(nonce, tmsg.nonce, 8); - *flags = GUINT16_FROM_LE(tmsg->flags);
+ *flags = GUINT16_FROM_LE(tmsg.flags); purple_debug_error("ntlm", "Unable to parse type2 message - returning empty nonce.\n");
--- a/libpurple/proxy.c Thu Apr 03 09:26:19 2014 +0530
+++ b/libpurple/proxy.c Thu Apr 03 13:31:04 2014 +0200
@@ -748,14 +748,14 @@
-proxy_connect_udp_none(PurpleProxyConnectData *connect_data, struct sockaddr *addr, socklen_t addrlen)
+proxy_connect_udp_none(PurpleProxyConnectData *connect_data, common_sockaddr_t *addr, socklen_t addrlen) purple_debug_info("proxy", "UDP Connecting to %s:%d with no proxy\n",
connect_data->host, connect_data->port);
- connect_data->fd = socket(addr->sa_family, SOCK_DGRAM, 0);
+ connect_data->fd = socket(addr->sa.sa_family, SOCK_DGRAM, 0); if (connect_data->fd < 0)
purple_proxy_connect_data_disconnect_formatted(connect_data,
@@ -769,7 +769,7 @@
fcntl(connect_data->fd, F_SETFD, FD_CLOEXEC);
- if (connect(connect_data->fd, addr, addrlen) != 0)
+ if (connect(connect_data->fd, &addr->sa, addrlen) != 0) if ((errno == EINPROGRESS) || (errno == EINTR))
@@ -810,14 +810,14 @@
-proxy_connect_none(PurpleProxyConnectData *connect_data, struct sockaddr *addr, socklen_t addrlen)
+proxy_connect_none(PurpleProxyConnectData *connect_data, common_sockaddr_t *addr, socklen_t addrlen) purple_debug_info("proxy", "Connecting to %s:%d with no proxy\n",
connect_data->host, connect_data->port);
- connect_data->fd = socket(addr->sa_family, SOCK_STREAM, 0);
+ connect_data->fd = socket(addr->sa.sa_family, SOCK_STREAM, 0); if (connect_data->fd < 0)
purple_proxy_connect_data_disconnect_formatted(connect_data,
@@ -831,7 +831,7 @@
fcntl(connect_data->fd, F_SETFD, FD_CLOEXEC);
- if (connect(connect_data->fd, addr, addrlen) != 0)
+ if (connect(connect_data->fd, &addr->sa, addrlen) != 0) if ((errno == EINPROGRESS) || (errno == EINTR))
@@ -1258,7 +1258,7 @@
-proxy_connect_http(PurpleProxyConnectData *connect_data, struct sockaddr *addr, socklen_t addrlen)
+proxy_connect_http(PurpleProxyConnectData *connect_data, common_sockaddr_t *addr, socklen_t addrlen) @@ -1268,7 +1268,7 @@
(purple_proxy_info_get_host(connect_data->gpi) ? purple_proxy_info_get_host(connect_data->gpi) : "(null)"),
purple_proxy_info_get_port(connect_data->gpi));
- connect_data->fd = socket(addr->sa_family, SOCK_STREAM, 0);
+ connect_data->fd = socket(addr->sa.sa_family, SOCK_STREAM, 0); if (connect_data->fd < 0)
purple_proxy_connect_data_disconnect_formatted(connect_data,
@@ -1282,7 +1282,7 @@
fcntl(connect_data->fd, F_SETFD, FD_CLOEXEC);
- if (connect(connect_data->fd, addr, addrlen) != 0) {
+ if (connect(connect_data->fd, &addr->sa, addrlen) != 0) { if (errno == EINPROGRESS || errno == EINTR) {
purple_debug_info("proxy", "HTTP connection in progress\n");
@@ -1335,7 +1335,7 @@
PurpleProxyConnectData *connect_data = data;
+ common_sockaddr_t *addr; connect_data->query_data = NULL;
@@ -1359,7 +1359,7 @@
packet[2] = connect_data->port >> 8;
packet[3] = connect_data->port & 0xff;
- memcpy(packet + 4, &((struct sockaddr_in *)addr)->sin_addr.s_addr, 4);
+ memcpy(packet + 4, &addr->in.sin_addr.s_addr, 4); @@ -1452,7 +1452,7 @@
-proxy_connect_socks4(PurpleProxyConnectData *connect_data, struct sockaddr *addr, socklen_t addrlen)
+proxy_connect_socks4(PurpleProxyConnectData *connect_data, common_sockaddr_t *addr, socklen_t addrlen) @@ -1462,7 +1462,7 @@
purple_proxy_info_get_host(connect_data->gpi),
purple_proxy_info_get_port(connect_data->gpi));
- connect_data->fd = socket(addr->sa_family, SOCK_STREAM, 0);
+ connect_data->fd = socket(addr->sa.sa_family, SOCK_STREAM, 0); if (connect_data->fd < 0)
purple_proxy_connect_data_disconnect_formatted(connect_data,
@@ -1476,7 +1476,7 @@
fcntl(connect_data->fd, F_SETFD, FD_CLOEXEC);
- if (connect(connect_data->fd, addr, addrlen) != 0)
+ if (connect(connect_data->fd, &addr->sa, addrlen) != 0) if ((errno == EINPROGRESS) || (errno == EINTR))
@@ -2109,7 +2109,7 @@
-proxy_connect_socks5(PurpleProxyConnectData *connect_data, struct sockaddr *addr, socklen_t addrlen)
+proxy_connect_socks5(PurpleProxyConnectData *connect_data, common_sockaddr_t *addr, socklen_t addrlen) @@ -2119,7 +2119,7 @@
purple_proxy_info_get_host(connect_data->gpi),
purple_proxy_info_get_port(connect_data->gpi));
- connect_data->fd = socket(addr->sa_family, SOCK_STREAM, 0);
+ connect_data->fd = socket(addr->sa.sa_family, SOCK_STREAM, 0); if (connect_data->fd < 0)
purple_proxy_connect_data_disconnect_formatted(connect_data,
@@ -2133,7 +2133,7 @@
fcntl(connect_data->fd, F_SETFD, FD_CLOEXEC);
- if (connect(connect_data->fd, addr, addrlen) != 0)
+ if (connect(connect_data->fd, &addr->sa, addrlen) != 0) if ((errno == EINPROGRESS) || (errno == EINTR))
@@ -2168,7 +2168,7 @@
static void try_connect(PurpleProxyConnectData *connect_data)
+ common_sockaddr_t *addr; char ipaddr[INET6_ADDRSTRLEN];
addrlen = GPOINTER_TO_INT(connect_data->hosts->data);
@@ -2176,15 +2176,14 @@
addr = connect_data->hosts->data;
connect_data->hosts = g_slist_remove(connect_data->hosts, connect_data->hosts->data);
- if (addr->sa_family == AF_INET)
- inet_ntop(addr->sa_family, &((struct sockaddr_in *)addr)->sin_addr,
+ if (addr->sa.sa_family == AF_INET) + inet_ntop(addr->sa.sa_family, &addr->in.sin_addr, - else if (addr->sa_family == AF_INET6)
- inet_ntop(addr->sa_family, &((struct sockaddr_in6 *)addr)->sin6_addr,
+ else if (addr->sa.sa_family == AF_INET6) + inet_ntop(addr->sa.sa_family, &addr->in6.sin6_addr, - memcpy(ipaddr, inet_ntoa(((struct sockaddr_in *)addr)->sin_addr),
+ memcpy(ipaddr, inet_ntoa(addr->in.sin_addr), sizeof(ipaddr)); purple_debug_info("proxy", "Attempting connection to %s\n", ipaddr);
--- a/libpurple/stun.c Thu Apr 03 09:26:19 2014 +0530
+++ b/libpurple/stun.c Thu Apr 03 13:31:04 2014 +0200
@@ -48,6 +48,10 @@
#define ATTRIB_MAPPEDADDRESS 0x0001
+#ifndef _SIZEOF_ADDR_IFREQ +# define _SIZEOF_ADDR_IFREQ(a) sizeof(a) @@ -159,12 +163,13 @@
static void reply_cb(gpointer data, gint source, PurpleInputCondition cond) {
struct stun_conn *sc = data;
+ struct ifreq buffer_ifr[1000]; - struct stun_attrib *attrib;
- struct stun_header *hdr;
+ struct stun_attrib attrib; + struct stun_header hdr; struct sockaddr_in *sinptr;
@@ -183,50 +188,50 @@
- hdr = (struct stun_header*) buffer;
- if ((gsize)len != (ntohs(hdr->len) + sizeof(struct stun_header))) {
+ memcpy(&hdr, buffer, sizeof(hdr)); + if ((gsize)len != (ntohs(hdr.len) + sizeof(struct stun_header))) { purple_debug_warning("stun", "got incomplete response\n");
- if(hdr->transid[0] != sc->packet->transid[0]
- || hdr->transid[1] != sc->packet->transid[1]
- || hdr->transid[2] != sc->packet->transid[2]
- || hdr->transid[3] != sc->packet->transid[3]) {
+ if(hdr.transid[0] != sc->packet->transid[0] + || hdr.transid[1] != sc->packet->transid[1] + || hdr.transid[2] != sc->packet->transid[2] + || hdr.transid[3] != sc->packet->transid[3]) { purple_debug_warning("stun", "got wrong transid\n");
- if (hdr->type != MSGTYPE_BINDINGRESPONSE) {
+ if (hdr.type != MSGTYPE_BINDINGRESPONSE) { purple_debug_warning("stun",
"Expected Binding Response, got %d\n",
- tmp = buffer + sizeof(struct stun_header);
- while((buffer + len) > (tmp + sizeof(struct stun_attrib))) {
- attrib = (struct stun_attrib*) tmp;
- tmp += sizeof(struct stun_attrib);
+ it = buffer + sizeof(struct stun_header); + while((buffer + len) > (it + sizeof(struct stun_attrib))) { + memcpy(&attrib, it, sizeof(attrib)); + it += sizeof(struct stun_attrib); - if (!((buffer + len) > (tmp + ntohs(attrib->len))))
+ if (!((buffer + len) > (it + ntohs(attrib.len)))) - if(attrib->type == htons(ATTRIB_MAPPEDADDRESS)
- && ntohs(attrib->len) == 8) {
+ if(attrib.type == htons(ATTRIB_MAPPEDADDRESS) + && ntohs(attrib.len) == 8) { /* Skip the first unused byte,
* the family(1 byte), and the port(2 bytes);
* then read the 4 byte IPv4 address */
- memcpy(&in.s_addr, tmp + 4, 4);
+ memcpy(&in.s_addr, it + 4, 4); g_strlcpy(nattype.publicip, ip, sizeof(nattype.publicip));
- tmp += ntohs(attrib->len);
+ it += ntohs(attrib.len); purple_debug_info("stun", "got public ip %s\n", nattype.publicip);
nattype.status = PURPLE_STUN_STATUS_DISCOVERED;
@@ -235,19 +240,19 @@
- ifc.ifc_len = sizeof(buffer);
- ifc.ifc_req = (struct ifreq *) buffer;
+ ifc.ifc_len = sizeof(buffer_ifr); + ifc.ifc_req = buffer_ifr; ioctl(source, SIOCGIFCONF, &ifc);
- while(tmp < buffer + ifc.ifc_len) {
- ifr = (struct ifreq *) tmp;
- tmp += sizeof(struct ifreq);
+ it_end = it + ifc.ifc_len; + ifr = (struct ifreq*)(gpointer)it; + it += _SIZEOF_ADDR_IFREQ(*ifr); if(ifr->ifr_addr.sa_family == AF_INET) {
/* we only care about ipv4 interfaces */
- sinptr = (struct sockaddr_in *) &ifr->ifr_addr;
+ sinptr = (struct sockaddr_in *)(gpointer)&ifr->ifr_addr; if(sinptr->sin_addr.s_addr == in.s_addr) {
purple_debug_info("stun", "no nat\n");