pidgin/pidgin

Fix most of invalid alignment warnings

2014-04-03, Tomasz Wasilczyk
8b6b8a3b5039
Parents 65c1912ee2c8
Children 8688b5d1821e
Fix most of invalid alignment warnings
--- 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 ")",
+ out_len, out_size);
memset(input_padded, 0, out_len);
g_free(input_padded);
return -1;
--- a/libpurple/memorypool.c Thu Apr 03 09:26:19 2014 +0530
+++ b/libpurple/memorypool.c Thu Apr 03 13:31:04 2014 +0200
@@ -137,7 +137,7 @@
}
mem = PURPLE_MEMORY_PADDED(blk->available_ptr, alignment);
- g_assert(mem + size < blk->end_ptr);
+ g_assert((guintptr)mem + size < (guintptr)blk->end_ptr);
g_assert(mem >= blk->available_ptr); /* gpointer overflow */
}
--- 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 @@
const char *
purple_network_get_local_system_ip(int fd)
{
- char buffer[1024];
+ struct ifreq buffer[100];
+ guchar *it, *it_end;
static char ip[16];
- char *tmp;
struct ifconf ifc;
struct ifreq *ifr;
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;
+ ifc.ifc_req = buffer;
ioctl(source, SIOCGIFCONF, &ifc);
if (fd < 0)
close(source);
- tmp = buffer;
- while (tmp < buffer + ifc.ifc_len)
- {
- ifr = (struct ifreq *)tmp;
- tmp += HX_SIZE_OF_IFREQ(*ifr);
+ it = (guchar*)buffer;
+ it_end = it + ifc.ifc_len;
+ while (it < it_end) {
+ /* 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];
const char *tmp = NULL;
+ common_sockaddr_t *addr =
+ (common_sockaddr_t *)(gpointer)ifa->ifa_addr;
if ((family != AF_INET && family != AF_INET6) || ifa->ifa_flags & IFF_LOOPBACK)
continue;
if (family == AF_INET)
- 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));
else {
- 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));
}
if (tmp != NULL)
result = g_list_prepend(result, g_strdup(tmp));
@@ -231,25 +237,28 @@
#else /* HAVE_GETIFADDRS && HAVE_INET_NTOP */
GList *result = NULL;
int source = socket(PF_INET,SOCK_STREAM, 0);
- char buffer[1024];
- char *tmp;
+ struct ifreq buffer[100];
+ guchar *it, *it_end;
struct ifconf ifc;
struct ifreq *ifr;
ifc.ifc_len = sizeof(buffer);
- ifc.ifc_req = (struct ifreq *)buffer;
+ ifc.ifc_req = buffer;
ioctl(source, SIOCGIFCONF, &ifc);
close(source);
- tmp = buffer;
- while (tmp < buffer + ifc.ifc_len) {
+ it = (guchar*)buffer;
+ it_end = it + ifc.ifc_len;
+ while (it < it_end) {
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,
sizeof(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,
dst, sizeof(dst));
} else {
- inet_ntop(addr->sa_family, &((struct sockaddr_in *) addr)->sin_addr,
+ inet_ntop(addr->sa.sa_family, &addr->in.sin_addr,
dst, sizeof(dst));
}
--- 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;
tmsg->protocol[0] = 'N';
tmsg->protocol[1] = 'T';
tmsg->protocol[2] = 'L';
@@ -149,19 +149,22 @@
purple_ntlm_parse_type2(const gchar *type2, guint32 *flags)
{
gsize retlen;
- struct type2_message *tmsg;
+ guchar *buff;
+ struct type2_message tmsg;
static guint8 nonce[8];
- 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);
if (flags != NULL)
- *flags = GUINT16_FROM_LE(tmsg->flags);
+ *flags = GUINT16_FROM_LE(tmsg.flags);
} else {
purple_debug_error("ntlm", "Unable to parse type2 message - returning empty nonce.\n");
memset(nonce, 0, 8);
}
- g_free(tmsg);
+ g_free(buff);
return nonce;
}
--- 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 @@
}
static void
-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)
{
int flags;
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);
#endif
- 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 @@
}
static void
-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)
{
int flags;
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);
#endif
- 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 @@
}
static void
-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)
{
int flags;
@@ -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);
#endif
- 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;
unsigned char packet[9];
- struct sockaddr *addr;
+ common_sockaddr_t *addr;
connect_data->query_data = NULL;
@@ -1359,7 +1359,7 @@
packet[1] = 0x01;
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);
packet[8] = 0x00;
g_free(addr);
@@ -1452,7 +1452,7 @@
}
static void
-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)
{
int flags;
@@ -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);
#endif
- 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 @@
}
static void
-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)
{
int flags;
@@ -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);
#endif
- 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)
{
socklen_t addrlen;
- struct sockaddr *addr;
+ 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);
#ifdef HAVE_INET_NTOP
- 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,
ipaddr, sizeof(ipaddr));
- 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,
ipaddr, sizeof(ipaddr));
#else
- memcpy(ipaddr, inet_ntoa(((struct sockaddr_in *)addr)->sin_addr),
- sizeof(ipaddr));
+ memcpy(ipaddr, inet_ntoa(addr->in.sin_addr), sizeof(ipaddr));
#endif
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)
+#endif
+
struct stun_header {
guint16 type;
guint16 len;
@@ -159,12 +163,13 @@
static void reply_cb(gpointer data, gint source, PurpleInputCondition cond) {
struct stun_conn *sc = data;
- char buffer[65536];
- char *tmp;
+ guchar buffer[65536];
+ struct ifreq buffer_ifr[1000];
+ guchar *it, *it_end;
gssize len;
struct in_addr in;
- struct stun_attrib *attrib;
- struct stun_header *hdr;
+ struct stun_attrib attrib;
+ struct stun_header hdr;
struct ifconf ifc;
struct ifreq *ifr;
struct sockaddr_in *sinptr;
@@ -183,50 +188,50 @@
return;
}
- 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");
return;
}
/* wrong transaction */
- 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");
return;
}
if(sc->test==1) {
- if (hdr->type != MSGTYPE_BINDINGRESPONSE) {
+ if (hdr.type != MSGTYPE_BINDINGRESPONSE) {
purple_debug_warning("stun",
"Expected Binding Response, got %d\n",
- hdr->type);
+ hdr.type);
return;
}
- 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))))
break;
- if(attrib->type == htons(ATTRIB_MAPPEDADDRESS)
- && ntohs(attrib->len) == 8) {
+ if(attrib.type == htons(ATTRIB_MAPPEDADDRESS)
+ && ntohs(attrib.len) == 8) {
char *ip;
/* 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);
ip = inet_ntoa(in);
if(ip)
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 @@
/* is it a NAT? */
- 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);
- tmp = buffer;
- while(tmp < buffer + ifc.ifc_len) {
- ifr = (struct ifreq *) tmp;
-
- tmp += sizeof(struct ifreq);
+ it = buffer;
+ it_end = it + ifc.ifc_len;
+ while (it < it_end) {
+ 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) {
/* no NAT */
purple_debug_info("stun", "no nat\n");