aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Thelen <gthelen@google.com>2012-01-04 17:02:09 -0800
committerH. Peter Anvin <hpa@linux.intel.com>2012-05-15 15:27:29 -0700
commit5cbb4b62b12bbdabb0b82804fc84c763553aeae2 (patch)
tree3ad8e5e3bbcc711b46cb355900b5afda531ad6d8
parent0506a36568ff0b4fd482513bc919d2031c35d04f (diff)
downloadklibc-5cbb4b62b12bbdabb0b82804fc84c763553aeae2.tar.gz
[klibc] nfsmount: clean up dummypmap compiler warning
Without this patch gcc 4.6 warns: KLIBCCC usr/kinit/nfsmount/dummypmap.o usr/kinit/nfsmount/dummypmap.c: In function 'dummy_portmap': usr/kinit/nfsmount/dummypmap.c:191:13: warning: array subscript is below array bounds [-Warray-bounds] [ hpa: removed incorrect packed attribute and enum abuse ] Signed-off-by: Greg Thelen <gthelen@google.com> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r--usr/kinit/nfsmount/dummypmap.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/usr/kinit/nfsmount/dummypmap.c b/usr/kinit/nfsmount/dummypmap.c
index 7c5b6bcd64ce30..a4e8014701f9a4 100644
--- a/usr/kinit/nfsmount/dummypmap.c
+++ b/usr/kinit/nfsmount/dummypmap.c
@@ -144,13 +144,18 @@ static int check_vrf(struct rpc_auth *vrf)
return (vrf->flavor == htonl(AUTH_NULL)) ? 0 : -1;
}
+#define MAX_UDP_PACKET 65536
+
static int dummy_portmap(int sock, FILE *portmap_file)
{
struct sockaddr_in sin;
int pktlen, addrlen;
- unsigned char pkt[65536]; /* Max UDP packet size */
- /* RPC UDP packets do not include TCP fragment size */
- struct rpc_call *rpc = (struct rpc_call *) &pkt[-4];
+ union {
+ struct rpc_call rpc;
+ /* Max UDP packet size + unused TCP fragment size */
+ char payload[MAX_UDP_PACKET + offsetof(struct rpc_header, udp)];
+ } pkt;
+ struct rpc_call *rpc = &pkt.rpc;
struct rpc_auth *cred;
struct rpc_auth *vrf;
struct portmap_args *args;
@@ -158,8 +163,8 @@ static int dummy_portmap(int sock, FILE *portmap_file)
for (;;) {
addrlen = sizeof sin;
- pktlen = recvfrom(sock, &pkt, sizeof pkt, 0,
- (struct sockaddr *)&sin, &addrlen);
+ pktlen = recvfrom(sock, &rpc->hdr.udp, MAX_UDP_PACKET,
+ 0, (struct sockaddr *)&sin, &addrlen);
if (pktlen < 0) {
if (errno == EINTR)
@@ -189,9 +194,11 @@ static int dummy_portmap(int sock, FILE *portmap_file)
} else if (rpc->prog_vers != htonl(2)) {
rply.rpc.reply_state = htonl(PROG_MISMATCH);
} else if (!(vrf = get_auth(cred)) ||
- (char *)vrf > (char *)pkt + pktlen - 8 - sizeof(*args) ||
+ (char *)vrf > ((char *)&rpc->hdr.udp + pktlen - 8 -
+ sizeof(*args)) ||
!(args = get_auth(vrf)) ||
- (char *)args > (char *)pkt + pktlen - sizeof(*args) ||
+ (char *)args > ((char *)&rpc->hdr.udp + pktlen -
+ sizeof(*args)) ||
check_cred(cred) || check_vrf(vrf)) {
/* Can't deal with credentials data; the kernel
won't send them */