]> git.kaiwu.me - nginx.git/commitdiff
fix building by gcc 4.x with -O2/3/s in some Linux distributions:
authorIgor Sysoev <igor@sysoev.ru>
Tue, 22 Dec 2009 15:29:56 +0000 (15:29 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Tue, 22 Dec 2009 15:29:56 +0000 (15:29 +0000)
   dereferencing type-punned pointer will break strict-aliasing rules

src/os/unix/ngx_channel.c

index f0f337d0684154e281d58e2af0fb155542fa2cb6..a9ac45c9c374f2193f5b7b1747aca45e8e7d86fc 100644 (file)
@@ -36,7 +36,18 @@ ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size,
         cmsg.cm.cmsg_len = CMSG_LEN(sizeof(int));
         cmsg.cm.cmsg_level = SOL_SOCKET;
         cmsg.cm.cmsg_type = SCM_RIGHTS;
-        *(int *) CMSG_DATA(&cmsg.cm) = ch->fd;
+
+        /*
+         * We have to use ngx_memcpy() instead of simple
+         *   *(int *) CMSG_DATA(&cmsg.cm) = ch->fd;
+         * because some gcc 4.4 with -O2/3/s optimization issues the warning:
+         *   dereferencing type-punned pointer will break strict-aliasing rules
+         *
+         * Fortunately, gcc with -O1 compiles this ngx_memcpy()
+         * in the same simple assigment as in the code above
+         */
+
+        ngx_memcpy(CMSG_DATA(&cmsg.cm), &ch->fd, sizeof(int));
     }
 
     msg.msg_flags = 0;
@@ -153,7 +164,9 @@ ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, ngx_log_t *log)
             return NGX_ERROR;
         }
 
-        ch->fd = *(int *) CMSG_DATA(&cmsg.cm);
+        /* ch->fd = *(int *) CMSG_DATA(&cmsg.cm); */
+
+        ngx_memcpy(&ch->fd, CMSG_DATA(&cmsg.cm), sizeof(int));
     }
 
     if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) {