Fix aliasing issues in RPC code
This commit is contained in:
parent
aff2453df7
commit
4efbd5cb39
@ -1,3 +1,9 @@
|
|||||||
|
2011-12-04 Ulrich Drepper <drepper@gmail.com>
|
||||||
|
|
||||||
|
* sunrpc/clnt_unix.c (clntunix_control): Fix aliasing issues.
|
||||||
|
* sunrpc/clnt_tcp.c (clnttcp_control): Likewise.
|
||||||
|
* sunrpc/clnt_udp.c (clntudp_call): Likewise.
|
||||||
|
|
||||||
2011-12-03 Ulrich Drepper <drepper@gmail.com>
|
2011-12-03 Ulrich Drepper <drepper@gmail.com>
|
||||||
|
|
||||||
* inet/netinet/in.h: Provide versions of IN6_IS_ADDR_UNSPECIFIED,
|
* inet/netinet/in.h: Provide versions of IN6_IS_ADDR_UNSPECIFIED,
|
||||||
|
@ -364,6 +364,8 @@ static bool_t
|
|||||||
clnttcp_control (CLIENT *cl, int request, char *info)
|
clnttcp_control (CLIENT *cl, int request, char *info)
|
||||||
{
|
{
|
||||||
struct ct_data *ct = (struct ct_data *) cl->cl_private;
|
struct ct_data *ct = (struct ct_data *) cl->cl_private;
|
||||||
|
u_long *mcall_ptr;
|
||||||
|
u_long ul;
|
||||||
|
|
||||||
|
|
||||||
switch (request)
|
switch (request)
|
||||||
@ -393,11 +395,24 @@ clnttcp_control (CLIENT *cl, int request, char *info)
|
|||||||
* first element in the call structure *.
|
* first element in the call structure *.
|
||||||
* This will get the xid of the PREVIOUS call
|
* 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);
|
*(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;
|
break;
|
||||||
case CLSET_XID:
|
case CLSET_XID:
|
||||||
/* This will set the xid of the NEXT call */
|
/* 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);
|
*(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 */
|
/* decrement by 1 as clnttcp_call() increments once */
|
||||||
break;
|
break;
|
||||||
case CLGET_VERS:
|
case CLGET_VERS:
|
||||||
|
@ -473,8 +473,7 @@ send_again:
|
|||||||
/* see if reply transaction id matches sent id.
|
/* see if reply transaction id matches sent id.
|
||||||
Don't do this if we only wait for a replay */
|
Don't do this if we only wait for a replay */
|
||||||
if (xargs != NULL
|
if (xargs != NULL
|
||||||
&& (*((u_int32_t *) (cu->cu_inbuf))
|
&& memcmp (cu->cu_inbuf, cu->cu_outbuf, sizeof (u_int32_t)) != 0)
|
||||||
!= *((u_int32_t *) (cu->cu_outbuf))))
|
|
||||||
continue;
|
continue;
|
||||||
/* we now assume we have the proper reply */
|
/* we now assume we have the proper reply */
|
||||||
break;
|
break;
|
||||||
|
@ -338,7 +338,8 @@ static bool_t
|
|||||||
clntunix_control (CLIENT *cl, int request, char *info)
|
clntunix_control (CLIENT *cl, int request, char *info)
|
||||||
{
|
{
|
||||||
struct ct_data *ct = (struct ct_data *) cl->cl_private;
|
struct ct_data *ct = (struct ct_data *) cl->cl_private;
|
||||||
|
u_long *mcall_ptr;
|
||||||
|
u_long ul;
|
||||||
|
|
||||||
switch (request)
|
switch (request)
|
||||||
{
|
{
|
||||||
@ -366,11 +367,24 @@ clntunix_control (CLIENT *cl, int request, char *info)
|
|||||||
* first element in the call structure *.
|
* first element in the call structure *.
|
||||||
* This will get the xid of the PREVIOUS call
|
* 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);
|
*(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;
|
break;
|
||||||
case CLSET_XID:
|
case CLSET_XID:
|
||||||
/* This will set the xid of the NEXT call */
|
/* 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);
|
*(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 clntunix_call() increments once */
|
/* decrement by 1 as clntunix_call() increments once */
|
||||||
break;
|
break;
|
||||||
case CLGET_VERS:
|
case CLGET_VERS:
|
||||||
|
Loading…
Reference in New Issue
Block a user