diff options
author | Greg Thelen <gthelen@google.com> | 2012-01-04 17:02:09 -0800 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2012-05-15 15:27:29 -0700 |
commit | 5cbb4b62b12bbdabb0b82804fc84c763553aeae2 (patch) | |
tree | 3ad8e5e3bbcc711b46cb355900b5afda531ad6d8 | |
parent | 0506a36568ff0b4fd482513bc919d2031c35d04f (diff) | |
download | klibc-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.c | 21 |
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 */ |