--- parser3/src/main/untaint.C 2004/07/01 07:20:10 1.133 +++ parser3/src/main/untaint.C 2006/02/18 18:01:33 1.136.6.1 @@ -1,11 +1,11 @@ /** @file Parser: String class part: untaint mechanizm. - Copyright(c) 2001-2004 ArtLebedev Group (http://www.artlebedev.com) + Copyright(c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_UNTAINT_C="$Date: 2004/07/01 07:20:10 $"; +static const char * const IDENT_UNTAINT_C="$Date: 2006/02/18 18:01:33 $"; #include "pa_string.h" @@ -92,6 +92,9 @@ inline bool need_http_header_encode(unsi return need_uri_encode(c); } +inline bool need_regex_escape(unsigned char c){ + return strchr("\\^$.[]|()?*+{}", c)!=0; +} // String @@ -371,6 +374,8 @@ int cstr_to_string_body_block(char alang bool email=false; uchar c; for(const char* src=mail_ptr; (c=(uchar)*src++); ) { + if(c=='\r' || c=='\n') + c=' '; if(to_quoted_printable && (c==',' || c == '"' || addr_spec_soon(src-1/*position to 'c'*/))) { email=c=='<'; to_string("?="); @@ -463,6 +468,14 @@ int cstr_to_string_body_block(char alang default: _default; break; }); break; + case String::L_REGEX: + // tainted, untaint language: regex + escape( + if(need_regex_escape(c)) + to_char('\\') + _default; + ); + break; default: SAPI::abort("unknown untaint language #%d", static_cast(to_lang)); // should never @@ -478,6 +491,8 @@ int cstr_to_string_body_block(char alang String::Body String::cstr_to_string_body(Language lang, SQL_Connection* connection, const Request_charsets *charsets) const { + if(is_empty()) + return String::Body(); Cstr_to_string_body_block_info info; // input @@ -492,8 +507,6 @@ String::Body String::cstr_to_string_body info.fragment_begin=0; info.whitespace=true; - if(!is_empty()) - langs.for_each(body, cstr_to_string_body_block, &info); - + langs.for_each(body, cstr_to_string_body_block, &info); return String::Body(CORD_ec_to_cord(info.result)); }