nginx-0.8.30

Maxim Dounin mdounin на mdounin.ru
Пн Дек 21 16:16:16 MSK 2009


Hello!

On Mon, Dec 21, 2009 at 03:50:27PM +0300, Igor Sysoev wrote:

> On Mon, Dec 21, 2009 at 02:36:26PM +0200, Andrew Sitnikov wrote:
> 
> > Hello Igor,
> > 
> > IS> Это не только gcc 4.1, но на фрибсдшном наборе gcc это не воспроизводится.
> > IS> Твой вариант с memcpy мне не нравится: оно не мешает при переконфигурации,
> > IS> но как общее решение не подходит - зачем копировать лишнее в run-time.
> > на 0.7.x такого кстати нет.
> 
> Тут две проблемы в разных файлах.
> Твоя появилась в 0.8.12.
> А та, которую фиксил Макс, скорее всего, в 0.8.21.

Вот кстати третья (gcc 4.4.0, Ubuntu 4.4.0-8ubuntu2):

gcc-4.4 -c -O -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Wunused-function -Wunused-variable -Wunused-value -Werror -g -O2 -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
                -o objs/src/os/unix/ngx_channel.o \
                src/os/unix/ngx_channel.c
cc1: warnings being treated as errors
src/os/unix/ngx_channel.c: In function ‘ngx_write_channel’:
src/os/unix/ngx_channel.c:39: error: dereferencing type-punned pointer will break strict-aliasing rules
src/os/unix/ngx_channel.c: In function ‘ngx_read_channel’:
src/os/unix/ngx_channel.c:156: error: dereferencing type-punned pointer will break strict-aliasing rules

Патч прилагается.

Вот тут IMHO memcpy вполне правилен, правильнее некуда.

Maxim Dounin
-------------- next part --------------
diff -r 72104cd120ec src/os/unix/ngx_channel.c
--- a/src/os/unix/ngx_channel.c	Tue Dec 15 00:00:00 2009 +0300
+++ b/src/os/unix/ngx_channel.c	Mon Dec 21 16:10:45 2009 +0300
@@ -36,7 +36,7 @@
         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;
+        ngx_memcpy(CMSG_DATA(&cmsg.cm), &ch->fd, sizeof(ch->fd));
     }
 
     msg.msg_flags = 0;
@@ -153,7 +153,7 @@
             return NGX_ERROR;
         }
 
-        ch->fd = *(int *) CMSG_DATA(&cmsg.cm);
+        ngx_memcpy(&ch->fd, CMSG_DATA(&cmsg.cm), sizeof(ch->fd));
     }
 
     if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) {


Подробная информация о списке рассылки nginx-ru