Re: Баг парсинга ip адресов при сборке с --with-ipv6

Maxim Dounin mdounin на mdounin.ru
Ср Апр 13 15:30:02 MSD 2011


Hello!

On Tue, Apr 12, 2011 at 09:57:31PM -0400, INF[SZ] wrote:

> При включении опции сборки  --with-ipv6 и
> внесении в локацию ip адреса в котором
> забыта точка между 2 и 3 октетом получаю
> ошибку сегментирования  
> 
> Например
> 
> location / {                                                           
> 
>             root   /usr/share/nginx/html;                               
>        
>             index  index.html index.htm;                                
>        
>             allow 80.24797.12;                                          
>        
>         }
> 
> nginx -t 
> ошибка сегментирования
> 
> при сборке Nginx без поддержки ipv6 при том
> же конфиге парсинг проходит удачно и на
> выходе как и положено получаю ошибку:
> 
> nginx: [emerg]: invalid parameter "80.24797.12" in
> /etc/nginx/nginx.conf:54
> nginx: configuration file /etc/nginx/nginx.conf test failed
> 
> 
> Проверял на Nginx 0.8, 0.9, 1.0 ветках.

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

Maxim Dounin
-------------- next part --------------
# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1302694009 -14400
# Node ID c0045a9cf3218bd4f77ecb8c0a5e75ad47a436f9
# Parent  00d13b6d4ebd225f94a2e2a3afa7dbd3ddfe4ed7
Fix ipv6 address parsing.

Parsing icorrectly formated addresses caused segmentation fault in some
cases, e.g. as in

    allow 80.24797.12;

(note missing dot - this is not valid ipv4 address and hence nginx will
attempt to parse it as ipv6 one if configured with ipv6), or

    listen [127.0.0.1]:8080;

(note ipv4 address instead of ipv6 one in square brackets).

See here for original report:

http://forum.nginx.org/read.php?21,190741,190741#msg-190741

diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c
--- a/src/core/ngx_inet.c
+++ b/src/core/ngx_inet.c
@@ -110,7 +110,7 @@ ngx_inet6_addr(u_char *p, size_t len, u_
         }
 
         if (c == '.' && nibbles) {
-            if (n < 2) {
+            if (n < 2 || digit == NULL) {
                 return NGX_ERROR;
             }
 


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