rodrigc created this revision.
rodrigc added reviewers: araujo, bapt, emaste, dim.
rodrigc added a subscriber: freebsd-toolchain.
rodrigc set the repository for this revision to rS FreeBSD src repository.
Herald added a subscriber: imp.

REVISION SUMMARY
  Without this fix, compiling ypbind with gcc 4.9 will give warnings such as 
this:
  
  ```
  /opt2/branches/head/usr.sbin/ypbind/ypbind.c: In function 'rpc_received':
  /opt2/branches/head/usr.sbin/ypbind/ypbind.c:948:2: warning: dereferencing 
type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
    *(u_int32_t *)&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr = 
raddrp->sin_addr.s_addr;
    ^
  ```

REPOSITORY
  rS FreeBSD src repository

REVISION DETAIL
  https://reviews.freebsd.org/D2690

AFFECTED FILES
  usr.sbin/ypbind/ypbind.c

CHANGE DETAILS
  diff --git a/usr.sbin/ypbind/ypbind.c b/usr.sbin/ypbind/ypbind.c
  --- a/usr.sbin/ypbind/ypbind.c
  +++ b/usr.sbin/ypbind/ypbind.c
  @@ -225,10 +225,10 @@
   
        res.ypbind_status = YPBIND_SUCC_VAL;
        res.ypbind_resp_u.ypbind_error = 0; /* Success */
  -     *(u_int32_t *)&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr =
  -             ypdb->dom_server_addr.sin_addr.s_addr;
  -     *(u_short *)&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port =
  -             ypdb->dom_server_addr.sin_port;
  +     memcpy(&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr,
  +         &ypdb->dom_server_addr.sin_addr.s_addr, sizeof(u_int32_t));
  +     memcpy(&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port,
  +         &ypdb->dom_server_addr.sin_port, sizeof(u_short));
        /*printf("domain %s at %s/%d\n", ypdb->dom_domain,
                inet_ntoa(ypdb->dom_server_addr.sin_addr),
                ntohs(ypdb->dom_server_addr.sin_port));*/
  @@ -275,8 +275,12 @@
   
        bzero(&bindsin, sizeof bindsin);
        bindsin.sin_family = AF_INET;
  -     bindsin.sin_addr.s_addr = *(u_int32_t 
*)argp->ypsetdom_binding.ypbind_binding_addr;
  -     bindsin.sin_port = *(u_short 
*)argp->ypsetdom_binding.ypbind_binding_port;
  +     memcpy(&bindsin.sin_addr.s_addr,
  +         &argp->ypsetdom_binding.ypbind_binding_addr,
  +         sizeof(u_int32_t));
  +     memcpy(&bindsin.sin_port,
  +         &argp->ypsetdom_binding.ypbind_binding_port,
  +         sizeof(u_short));
        rpc_received(argp->ypsetdom_domain, &bindsin, 1);
   
        return((void *) &result);
  @@ -945,8 +949,10 @@
   
        bzero(&ybr, sizeof ybr);
        ybr.ypbind_status = YPBIND_SUCC_VAL;
  -     *(u_int32_t *)&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr = 
raddrp->sin_addr.s_addr;
  -     *(u_short *)&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port = 
raddrp->sin_port;
  +     memcpy(ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr,
  +         &raddrp->sin_addr.s_addr, sizeof(u_int32_t));
  +     memcpy(&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port,
  +         &raddrp->sin_port, sizeof(u_short));
   
        if (writev(ypdb->dom_lockfd, iov, 2) != iov[0].iov_len + 
iov[1].iov_len) {
                syslog(LOG_WARNING, "write: %m");

EMAIL PREFERENCES
  https://reviews.freebsd.org/settings/panel/emailpreferences/

To: rodrigc, araujo, bapt, emaste, dim
Cc: imp, freebsd-toolchain
diff --git a/usr.sbin/ypbind/ypbind.c b/usr.sbin/ypbind/ypbind.c
--- a/usr.sbin/ypbind/ypbind.c
+++ b/usr.sbin/ypbind/ypbind.c
@@ -225,10 +225,10 @@
 
 	res.ypbind_status = YPBIND_SUCC_VAL;
 	res.ypbind_resp_u.ypbind_error = 0; /* Success */
-	*(u_int32_t *)&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr =
-		ypdb->dom_server_addr.sin_addr.s_addr;
-	*(u_short *)&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port =
-		ypdb->dom_server_addr.sin_port;
+	memcpy(&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr,
+	    &ypdb->dom_server_addr.sin_addr.s_addr, sizeof(u_int32_t));
+	memcpy(&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port,
+	    &ypdb->dom_server_addr.sin_port, sizeof(u_short));
 	/*printf("domain %s at %s/%d\n", ypdb->dom_domain,
 		inet_ntoa(ypdb->dom_server_addr.sin_addr),
 		ntohs(ypdb->dom_server_addr.sin_port));*/
@@ -275,8 +275,12 @@
 
 	bzero(&bindsin, sizeof bindsin);
 	bindsin.sin_family = AF_INET;
-	bindsin.sin_addr.s_addr = *(u_int32_t *)argp->ypsetdom_binding.ypbind_binding_addr;
-	bindsin.sin_port = *(u_short *)argp->ypsetdom_binding.ypbind_binding_port;
+	memcpy(&bindsin.sin_addr.s_addr,
+	    &argp->ypsetdom_binding.ypbind_binding_addr,
+	    sizeof(u_int32_t));
+	memcpy(&bindsin.sin_port,
+	    &argp->ypsetdom_binding.ypbind_binding_port,
+	    sizeof(u_short));
 	rpc_received(argp->ypsetdom_domain, &bindsin, 1);
 
 	return((void *) &result);
@@ -945,8 +949,10 @@
 
 	bzero(&ybr, sizeof ybr);
 	ybr.ypbind_status = YPBIND_SUCC_VAL;
-	*(u_int32_t *)&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr = raddrp->sin_addr.s_addr;
-	*(u_short *)&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port = raddrp->sin_port;
+	memcpy(ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr,
+	    &raddrp->sin_addr.s_addr, sizeof(u_int32_t));
+	memcpy(&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port,
+	    &raddrp->sin_port, sizeof(u_short));
 
 	if (writev(ypdb->dom_lockfd, iov, 2) != iov[0].iov_len + iov[1].iov_len) {
 		syslog(LOG_WARNING, "write: %m");

_______________________________________________
freebsd-toolchain@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-toolchain
To unsubscribe, send any mail to "freebsd-toolchain-unsubscr...@freebsd.org"

Reply via email to