1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

Fix sunrpc 64-bit (especially big-endian) issues (bug 14821).

This commit is contained in:
Joseph Myers
2012-11-09 18:21:59 +00:00
parent 554066b83b
commit fb1ae1eede
5 changed files with 66 additions and 57 deletions

View File

@ -338,8 +338,8 @@ static bool_t
clntunix_control (CLIENT *cl, int request, char *info)
{
struct ct_data *ct = (struct ct_data *) cl->cl_private;
u_long *mcall_ptr;
u_long ul;
u_int32_t ui32;
switch (request)
{
@ -367,24 +367,15 @@ clntunix_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 (&ui32, ct->ct_mcall, sizeof (ui32));
ul = ntohl (ui32);
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
memcpy (&ul, info, sizeof (ul));
ui32 = htonl (ul - 1);
memcpy (ct->ct_mcall, &ui32, sizeof (ui32));
/* decrement by 1 as clntunix_call() increments once */
break;
case CLGET_VERS:
@ -394,12 +385,14 @@ clntunix_control (CLIENT *cl, int request, char *info)
* begining of the RPC header. MUST be changed if the
* call_struct is changed
*/
*(u_long *) info = ntohl (*(u_long *) (ct->ct_mcall
+ 4 * BYTES_PER_XDR_UNIT));
memcpy (&ui32, ct->ct_mcall + 4 * BYTES_PER_XDR_UNIT, sizeof (ui32));
ul = ntohl (ui32);
memcpy (info, &ul, sizeof (ul));
break;
case CLSET_VERS:
*(u_long *) (ct->ct_mcall + 4 * BYTES_PER_XDR_UNIT)
= htonl (*(u_long *) info);
memcpy (&ul, info, sizeof (ul));
ui32 = htonl (ul);
memcpy (ct->ct_mcall + 4 * BYTES_PER_XDR_UNIT, &ui32, sizeof (ui32));
break;
case CLGET_PROG:
/*
@ -408,12 +401,14 @@ clntunix_control (CLIENT *cl, int request, char *info)
* begining of the RPC header. MUST be changed if the
* call_struct is changed
*/
*(u_long *) info = ntohl (*(u_long *) (ct->ct_mcall
+ 3 * BYTES_PER_XDR_UNIT));
memcpy (&ui32, ct->ct_mcall + 3 * BYTES_PER_XDR_UNIT, sizeof (ui32));
ul = ntohl (ui32);
memcpy (info, &ul, sizeof (ul));
break;
case CLSET_PROG:
*(u_long *) (ct->ct_mcall + 3 * BYTES_PER_XDR_UNIT)
= htonl(*(u_long *) info);
memcpy (&ul, info, sizeof (ul));
ui32 = htonl (ul);
memcpy (ct->ct_mcall + 3 * BYTES_PER_XDR_UNIT, &ui32, sizeof (ui32));
break;
/* The following are only possible with TI-RPC */
case CLGET_RETRY_TIMEOUT: