ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: implicit *LWS ?



On Thu, Oct 07, 2010 at 08:07:37PM +0400, Maxim Dounin wrote:
> > > 
> > > Это фича, LWS не поддерживаются, да и в HTTPbis они deprecated.
> > 
> > thanks. 
> > Хотя, jimho, не поддерживать deprecated и not recommended headers - это 
> > все-таки нарушение robustness principle (be liberal in what you accept). 
> 
> Кто ж спорит (хотя на самом деле с robustness principle нужно быть 
> очень осторожным, ибо он любит оборачиваться security flaws).  Но 
> хорошего патча нет, а приоритет у этой задачи всилу описанных 
> обстоятельств, скажем так, низкий.

но если будет сторонний патч, который удовлетворит критерию 
"хорошести", он имеет шансы на интеграцию (например, в 0.9) ? 

> > б) изменить логику чтения запроса, разрешив чтение в случае когда
> > буферизовано менее двух байт. 
> 
> Так нельзя - эти два байта вполне могут, скажем, вообще завершать 
> запрос.

Убедили. Существует use-case, в котором такое поведение все ломает. 

Второй вариант, модифицирующий только state machine, в аттаче. 

-- 
In theory, there is no difference between theory and practice. 
But, in practice, there is. 

--- src/http/ngx_http_parse.c.orig      2010-10-06 21:37:13.000000000 +0400
+++ src/http/ngx_http_parse.c   2010-10-08 16:51:15.000000000 +0400
@@ -762,6 +762,9 @@
         sw_space_before_value,
         sw_value,
         sw_space_after_value,
+        sw_CR_after_value,
+        sw_LF_after_value,
+        sw_CRLF_after_value,
         sw_ignore_line,
         sw_almost_done,
         sw_header_almost_done
@@ -909,11 +912,12 @@
                 break;
             case CR:
                 r->header_end = p;
-                state = sw_almost_done;
+                state = sw_CR_after_value;
                 break;
             case LF:
                 r->header_end = p;
-                goto done;
+                state = sw_LF_after_value;
+                break;
             }
             break;
 
@@ -923,10 +927,11 @@
             case ' ':
                 break;
             case CR:
-                state = sw_almost_done;
+                state = sw_CR_after_value;
                 break;
             case LF:
-                goto done;
+                state = sw_LF_after_value;
+                break;
             default:
                 state = sw_value;
                 break;
@@ -944,6 +949,57 @@
             }
             break;
 
+        /* CR after value */
+        case sw_CR_after_value: 
+            switch (ch) { 
+            case ' ': case '\t': 
+                *(p-1) = ' ';
+                state = sw_space_after_value;
+                break;
+            case LF: 
+                state = sw_CRLF_after_value;
+                break;
+            default: 
+                /* any other char means next header */
+                goto done_notlws;
+            }
+            break;
+
+        /* LF after value */
+        case sw_LF_after_value: 
+            switch(ch) { 
+            case ' ': case '\t': 
+                *(p-1) = ' ';
+                state = sw_space_after_value;
+                break;
+            case LF : 
+                /* whole header is done actually. reporting prev header */
+                goto done_notlws;
+            case CR : 
+                /* value LF CR.... Not LWS anyway */
+                goto done_notlws;
+            default: 
+                /* any other char means next header */
+                goto done_notlws;
+            }
+            break;
+
+        case sw_CRLF_after_value: 
+            switch(ch) { 
+            case ' ': case '\t': 
+                *(p-2) = ' ';
+                *(p-1) = ' ';
+                state = sw_space_after_value;
+                break;
+            case CR : case LF: 
+                /* whole header is done, actually. reporting prev header */
+                goto done_notlws;
+            default : 
+                /* next header most likely. reporting prev header done */
+                goto done_notlws;
+            }
+            break;
+
         /* end of header line */
         case sw_almost_done:
             switch (ch) {
@@ -983,6 +1039,15 @@
 
     return NGX_OK;
 
+done_notlws:
+
+    b->pos = p;
+    r->state = sw_start;
+    r->header_hash = hash;
+    r->lowcase_index = i;
+
+    return NGX_OK;
+
 header_done:
 
     b->pos = p + 1;
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.