Ticket #1555: Fix-1555-HTTP-Request-Response-only-accept-complet.patch

File Fix-1555-HTTP-Request-Response-only-accept-complet.patch, 4.5 kB (added by stbuehler, 6 months ago)
  • src/http_req.c

    From f16ae76b46b7d98b8a0be2024ed3330505e98054 Mon Sep 17 00:00:00 2001
    From: =?utf-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
    Date: Fri, 15 Feb 2008 11:53:58 +0100
    Subject: [PATCH] Fix #1555: HTTP Request/Response only accept complete headers, i.e. ended with double CRLF.
    
    ---
     src/http_req.c  |    7 +++++++
     src/http_resp.c |   34 ++++++++++++++++++++++++----------
     src/lempar.c    |    2 +-
     3 files changed, 32 insertions(+), 11 deletions(-)
    
    diff --git a/src/http_req.c b/src/http_req.c
    index ea9447a..42b900b 100644
    a b  
    263263                t.last_token_id = token_id; 
    264264        } 
    265265 
     266        // Tokenizer failed 
     267        if (parser_ret == PARSER_ERROR) { 
     268                ret = PARSE_ERROR; 
     269        } 
     270 
    266271        /* oops, the parser failed */ 
    267272        if (context.ok == 0) { 
    268273                ret = PARSE_ERROR; 
     
    300305                if (ret == PARSE_UNSET) { 
    301306                        ret = buffer_is_empty(context.errmsg) ? PARSE_NEED_MORE : PARSE_ERROR; 
    302307                } 
     308        } else if (parser_ret == PARSER_EOF) { // didn't see CRLF CRLF, no other error till now 
     309                ret = PARSE_NEED_MORE; 
    303310        } else { 
    304311                chunk *c; 
    305312 
  • src/http_resp.c

    diff --git a/src/http_resp.c b/src/http_resp.c
    index e3a4a8b..0a4461e 100644
    a b  
    9494        return 0; 
    9595} 
    9696 
    97  
    98 static int http_resp_tokenizer( 
     97typedef enum { 
     98        PARSER_UNSET, 
     99        PARSER_OK, 
     100        PARSER_ERROR, 
     101        PARSER_EOF 
     102} http_resp_parser_t; 
     103 
     104static http_resp_parser_t http_resp_tokenizer( 
    99105        http_resp_tokenizer_t *t, 
    100106        int *token_id, 
    101107        buffer *token 
     
    130136                                t->is_statusline = 0; 
    131137                                t->is_key = 1; 
    132138                        } else { 
    133                                 fprintf(stderr, "%s.%d: CR with out LF\r\n", __FILE__, __LINE__); 
    134                                 return -1; 
     139                                ERROR("CR with out LF at pos: %zu", t->offset); 
     140                                return PARSER_ERROR; 
    135141                        } 
    136142                        break; 
    137143                case '\n': 
     
    151157                                                if (c == ':') break; /* the : is the splitter between key and value */ 
    152158                                        } 
    153159                                } 
    154                                 if (0 != http_resp_lookup_next_char(t, &c)) return -1; 
     160                                if (0 != http_resp_lookup_next_char(t, &c)) return PARSER_EOF; 
    155161                        } 
    156162 
    157163                        if (t->c == t->lookup_c && 
    158164                                t->offset == t->lookup_offset + 1) { 
    159165 
    160                                 fprintf(stderr, "%s.%d: invalid char in string\n", __FILE__, __LINE__); 
    161                                 return -1; 
     166                                ERROR("invalid char (%d) at pos: %zu", c, t->offset); 
     167                                return PARSER_ERROR; 
    162168                        } 
    163169 
    164170                        tid = TK_STRING; 
     
    192198        if (tid) { 
    193199                *token_id = tid; 
    194200 
    195                 return 1; 
     201                return PARSER_OK; 
    196202        } 
    197203 
    198         return -1; 
     204        return PARSER_EOF; 
    199205} 
    200206 
    201207parse_status_t http_response_parse_cq(chunkqueue *cq, http_resp *resp) { 
     
    205211        buffer *token = NULL; 
    206212        http_resp_ctx_t context; 
    207213        parse_status_t ret = PARSE_UNSET; 
     214        http_resp_parser_t parser_ret; 
    208215        int last_token_id = 0; 
    209216 
    210217        if(!cq->first) return PARSE_NEED_MORE; 
     
    227234        http_resp_parserTrace(stderr, "http-response: "); 
    228235#endif 
    229236 
    230         while((1 == http_resp_tokenizer(&t, &token_id, token)) && context.ok) { 
     237        while((PARSER_OK == (parser_ret = http_resp_tokenizer(&t, &token_id, token))) && context.ok) { 
    231238                http_resp_parser(pParser, token_id, token, &context); 
    232239 
    233240                token = buffer_pool_get(context.unused_buffers); 
     
    239246                last_token_id = token_id; 
    240247        } 
    241248 
     249        // Tokenizer failed 
     250        if (parser_ret == PARSER_ERROR) { 
     251                ret = PARSE_ERROR; 
     252        } 
     253 
    242254        /* oops, the parser failed */ 
    243255        if (context.ok == 0) { 
    244256                ret = PARSE_ERROR; 
     
    266278                if (ret == PARSE_UNSET) { 
    267279                        ret = buffer_is_empty(context.errmsg) ? PARSE_NEED_MORE : PARSE_ERROR; 
    268280                } 
     281        } else if (parser_ret == PARSER_EOF) { // didn't see CRLF CRLF, no other error till now 
     282                ret = PARSE_NEED_MORE; 
    269283        } else { 
    270284                chunk *c; 
    271285 
  • src/lempar.c

    diff --git a/src/lempar.c b/src/lempar.c
    index 0af8e8c..cebc849 100644
    a b  
    572572  /* (re)initialize the parser, if necessary */ 
    573573  yypParser = (yyParser*)yyp; 
    574574  if( yypParser->yyidx<0 ){ 
    575     if( yymajor==0 ) return; 
     575    if( yymajor==0 ) return;    /* Accept empty input */ 
    576576    yypParser->yyidx = 0; 
    577577    yypParser->yyerrcnt = -1; 
    578578    yypParser->yystack[0].stateno = 0;