diff options
author | Ulrich Drepper <drepper@gmail.com> | 2011-12-04 13:20:06 -0500 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2011-12-04 13:20:06 -0500 |
commit | 4efbd5cb39dfa170056532185c724ab2ff545585 (patch) | |
tree | 6fc2f9183259908f20701503b97f6a6ad2dead40 /sunrpc/clnt_tcp.c | |
parent | aff2453df710c872588572a31928cff0e47da5b7 (diff) | |
download | glibc-4efbd5cb39dfa170056532185c724ab2ff545585.tar.gz |
Fix aliasing issues in RPC code
Diffstat (limited to 'sunrpc/clnt_tcp.c')
-rw-r--r-- | sunrpc/clnt_tcp.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/sunrpc/clnt_tcp.c b/sunrpc/clnt_tcp.c index 7cfbe9e8dd..d1fc43dbfd 100644 --- a/sunrpc/clnt_tcp.c +++ b/sunrpc/clnt_tcp.c @@ -364,6 +364,8 @@ static bool_t clnttcp_control (CLIENT *cl, int request, char *info) { struct ct_data *ct = (struct ct_data *) cl->cl_private; + u_long *mcall_ptr; + u_long ul; switch (request) @@ -393,11 +395,24 @@ clnttcp_control (CLIENT *cl, int request, char *info) * first element in the call structure *. * This will get the xid of the PREVIOUS call */ +#if 0 + /* This original code has aliasing issues. */ *(u_long *)info = ntohl (*(u_long *)ct->ct_mcall); +#else + mcall_ptr = (u_long *)ct->ct_mcall; + ul = ntohl (*mcall_ptr); + memcpy (info, &ul, sizeof (ul)); +#endif break; case CLSET_XID: /* This will set the xid of the NEXT call */ +#if 0 + /* This original code has aliasing issues. */ *(u_long *)ct->ct_mcall = htonl (*(u_long *)info - 1); +#else + ul = ntohl (*(u_long *)info - 1); + memcpy (ct->ct_mcall, &ul, sizeof (ul)); +#endif /* decrement by 1 as clnttcp_call() increments once */ break; case CLGET_VERS: |