Skip to content

Commit

Permalink
chromium: Fix aliasing violations
Browse files Browse the repository at this point in the history
Signed-off-by: Bernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org>
  • Loading branch information
Bernhard Rosenkraenzer authored and existz committed Jan 4, 2013
1 parent db1b899 commit 761666d
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 29 deletions.
13 changes: 10 additions & 3 deletions base/dir_reader_linux.h
Expand Up @@ -49,7 +49,11 @@ class DirReaderLinux {
// Move to the next entry returning false if the iteration is complete.
bool Next() {
if (size_) {
linux_dirent* dirent = reinterpret_cast<linux_dirent*>(&buf_[offset_]);
union {
const unsigned char *bufp;
const linux_dirent* dirent;
};
bufp = &buf_[offset_];
offset_ += dirent->d_reclen;
}

Expand All @@ -72,8 +76,11 @@ class DirReaderLinux {
if (!size_)
return NULL;

const linux_dirent* dirent =
reinterpret_cast<const linux_dirent*>(&buf_[offset_]);
union {
const unsigned char *bufp;
const linux_dirent* dirent;
};
bufp = &buf_[offset_];
return dirent->d_name;
}

Expand Down
17 changes: 10 additions & 7 deletions base/md5.cc
Expand Up @@ -27,7 +27,10 @@
struct Context {
uint32 buf[4];
uint32 bits[2];
unsigned char in[64];
union {
unsigned char in[64];
uint32_t in32[64/4];
};
};

/*
Expand Down Expand Up @@ -185,7 +188,7 @@ void MD5Update(MD5Context *pCtx, const void *inbuf, size_t len){
}
memcpy(p, buf, t);
byteReverse(ctx->in, 16);
MD5Transform(ctx->buf, (uint32 *)ctx->in);
MD5Transform(ctx->buf, ctx->in32);
buf += t;
len -= t;
}
Expand All @@ -195,7 +198,7 @@ void MD5Update(MD5Context *pCtx, const void *inbuf, size_t len){
while (len >= 64) {
memcpy(ctx->in, buf, 64);
byteReverse(ctx->in, 16);
MD5Transform(ctx->buf, (uint32 *)ctx->in);
MD5Transform(ctx->buf, ctx->in32);
buf += 64;
len -= 64;
}
Expand Down Expand Up @@ -230,7 +233,7 @@ void MD5Final(MD5Digest* digest, MD5Context *pCtx){
/* Two lots of padding: Pad the first block to 64 bytes */
memset(p, 0, count);
byteReverse(ctx->in, 16);
MD5Transform(ctx->buf, (uint32 *)ctx->in);
MD5Transform(ctx->buf, ctx->in32);

/* Now fill the next block with 56 bytes */
memset(ctx->in, 0, 56);
Expand All @@ -241,10 +244,10 @@ void MD5Final(MD5Digest* digest, MD5Context *pCtx){
byteReverse(ctx->in, 14);

/* Append length in bits and transform */
((uint32 *)ctx->in)[ 14 ] = ctx->bits[0];
((uint32 *)ctx->in)[ 15 ] = ctx->bits[1];
ctx->in32[ 14 ] = ctx->bits[0];
ctx->in32[ 15 ] = ctx->bits[1];

MD5Transform(ctx->buf, (uint32 *)ctx->in);
MD5Transform(ctx->buf, ctx->in32);
byteReverse((unsigned char *)ctx->buf, 4);
memcpy(digest->a, ctx->buf, 16);
memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */
Expand Down
10 changes: 6 additions & 4 deletions net/base/ip_endpoint.cc
Expand Up @@ -107,13 +107,15 @@ bool IPEndPoint::FromSockAddr(const struct sockaddr* address,
}

std::string IPEndPoint::ToString() const {
struct sockaddr_storage addr_storage;
union {
struct sockaddr_storage addr_storage;
struct sockaddr addr;
};
size_t addr_len = sizeof(addr_storage);
struct sockaddr* addr = reinterpret_cast<struct sockaddr*>(&addr_storage);
if (!ToSockAddr(addr, &addr_len)) {
if (!ToSockAddr(&addr, &addr_len)) {
return "";
}
return NetAddressToStringWithPort(addr, addr_len);
return NetAddressToStringWithPort(&addr, addr_len);
}

bool IPEndPoint::operator<(const IPEndPoint& that) const {
Expand Down
7 changes: 5 additions & 2 deletions net/base/network_change_notifier_netlink_linux.cc
Expand Up @@ -71,13 +71,16 @@ int InitializeNetlinkSocket() {
return -1;
}

struct sockaddr_nl local_addr;
union {
struct sockaddr_nl local_addr;
struct sockaddr local_addr_generic;
};
memset(&local_addr, 0, sizeof(local_addr));
local_addr.nl_family = AF_NETLINK;
local_addr.nl_pid = getpid();
local_addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR |
RTMGRP_NOTIFY;
int ret = bind(sock, reinterpret_cast<struct sockaddr*>(&local_addr),
int ret = bind(sock, &local_addr_generic,
sizeof(local_addr));
if (ret < 0) {
PLOG(ERROR) << "Error binding netlink socket";
Expand Down
19 changes: 12 additions & 7 deletions net/socket/tcp_client_socket_libevent.cc
Expand Up @@ -552,10 +552,13 @@ void TCPClientSocketLibevent::LogConnectCompletion(int net_error) {
return;
}

struct sockaddr_storage source_address;
union {
struct sockaddr_storage source_address;
struct sockaddr source_address_generic;
};
socklen_t addrlen = sizeof(source_address);
int rv = getsockname(
socket_, reinterpret_cast<struct sockaddr*>(&source_address), &addrlen);
socket_, &source_address_generic, &addrlen);
if (rv != 0) {
PLOG(ERROR) << "getsockname() [rv: " << rv << "] error: ";
NOTREACHED();
Expand All @@ -565,7 +568,7 @@ void TCPClientSocketLibevent::LogConnectCompletion(int net_error) {

const std::string source_address_str =
NetAddressToStringWithPort(
reinterpret_cast<const struct sockaddr*>(&source_address),
&source_address_generic,
sizeof(source_address));
net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT,
make_scoped_refptr(new NetLogStringParameter(
Expand Down Expand Up @@ -684,12 +687,14 @@ int TCPClientSocketLibevent::GetLocalAddress(IPEndPoint* address) const {
if (!IsConnected())
return ERR_SOCKET_NOT_CONNECTED;

struct sockaddr_storage addr_storage;
union {
struct sockaddr_storage addr_storage;
struct sockaddr addr;
};
socklen_t addr_len = sizeof(addr_storage);
struct sockaddr* addr = reinterpret_cast<struct sockaddr*>(&addr_storage);
if (getsockname(socket_, addr, &addr_len))
if (getsockname(socket_, &addr, &addr_len))
return MapSystemError(errno);
if (!address->FromSockAddr(addr, addr_len))
if (!address->FromSockAddr(&addr, addr_len))
return ERR_FAILED;

return OK;
Expand Down
16 changes: 10 additions & 6 deletions net/spdy/spdy_framer.cc
Expand Up @@ -1037,18 +1037,22 @@ size_t SpdyFramer::ProcessControlFramePayload(const char* data, size_t len) {
if (remaining_control_payload_)
break;
}
SpdyControlFrame control_frame(current_frame_buffer_, false);
visitor_->OnControl(&control_frame);
union {
SpdyControlFrame *control_frame;
SpdySynReplyControlFrame *control_frame_synreply;
};
control_frame=new SpdyControlFrame(current_frame_buffer_, false);
visitor_->OnControl(control_frame);

// If this is a FIN, tell the caller.
if (control_frame.type() == SYN_REPLY &&
control_frame.flags() & CONTROL_FLAG_FIN) {
visitor_->OnStreamFrameData(reinterpret_cast<SpdySynReplyControlFrame*>(
&control_frame)->stream_id(),
if (control_frame->type() == SYN_REPLY &&
control_frame->flags() & CONTROL_FLAG_FIN) {
visitor_->OnStreamFrameData(control_frame_synreply->stream_id(),
NULL, 0);
}

CHANGE_STATE(SPDY_IGNORE_REMAINING_PAYLOAD);
delete control_frame;
} while (false);
return original_len - len;
}
Expand Down

0 comments on commit 761666d

Please sign in to comment.