aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--sunrpc/clnt_tcp.c15
-rw-r--r--sunrpc/clnt_udp.c3
-rw-r--r--sunrpc/clnt_unix.c16
4 files changed, 37 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index ad891bedd3..6416f9e75b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
* inet/netinet/in.h: Provide versions of IN6_IS_ADDR_UNSPECIFIED,
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:
diff --git a/sunrpc/clnt_udp.c b/sunrpc/clnt_udp.c
index babee9abfd..294e13a58c 100644
--- a/sunrpc/clnt_udp.c
+++ b/sunrpc/clnt_udp.c
@@ -473,8 +473,7 @@ send_again:
/* see if reply transaction id matches sent id.
Don't do this if we only wait for a replay */
if (xargs != NULL
- && (*((u_int32_t *) (cu->cu_inbuf))
- != *((u_int32_t *) (cu->cu_outbuf))))
+ && memcmp (cu->cu_inbuf, cu->cu_outbuf, sizeof (u_int32_t)) != 0)
continue;
/* we now assume we have the proper reply */
break;
diff --git a/sunrpc/clnt_unix.c b/sunrpc/clnt_unix.c
index 62dc8c604b..282127bb8b 100644
--- a/sunrpc/clnt_unix.c
+++ b/sunrpc/clnt_unix.c
@@ -338,7 +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;
switch (request)
{
@@ -366,11 +367,24 @@ 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 (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 clntunix_call() increments once */
break;
case CLGET_VERS: