--- parser3/src/main/untaint.C 2003/09/23 14:07:49 1.118.2.5 +++ parser3/src/main/untaint.C 2004/01/22 08:27:20 1.122.2.1 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_UNTAINT_C="$Date: 2003/09/23 14:07:49 $"; +static const char* IDENT_UNTAINT_C="$Date: 2004/01/22 08:27:20 $"; #include "pa_string.h" @@ -72,8 +72,8 @@ extern "C" { // author forgot to do that CORD_ec_append(info->result, hex[((unsigned char)c)%0x10]); \ } else \ CORD_ec_append(info->result, otherwise); -#define to_char(c) CORD_ec_append(info->result, c) -#define to_string(s) CORD_ec_append_cord(info->result, s) +#define to_char(c) { CORD_ec_append(info->result, c); whitespace=false; } +#define to_string(s) { CORD_ec_append_cord(info->result, s); whitespace=false; } inline bool need_file_encode(unsigned char c){ // russian letters and space ENABLED @@ -170,7 +170,6 @@ inline bool need_quote_http_header(const #ifndef DOXYGEN struct Append_fragment_info { String::Language lang; - const StringBody dest_body; String::Languages* dest_languages; size_t dest_body_plan_length; }; @@ -182,10 +181,10 @@ int append_fragment_optimizing(char alan // clean piece would be marked OPTIMIZED manually // pieces with determined languages [not tainted|clean] would retain theirs langs info->dest_languages->append(info->dest_body_plan_length, - lang==String::Language::L_TAINTED? + lang==String::L_TAINTED? info->lang - :lang==String::Language::L_CLEAN? - (String::Language)(String::Language::L_CLEAN|String::Language::L_OPTIMIZE_BIT) // ORing with OPTIMIZED flag + :lang==String::L_CLEAN? + (String::Language)(String::L_CLEAN|String::L_OPTIMIZE_BIT) // ORing with OPTIMIZED flag :lang, asize); info->dest_body_plan_length+=asize; @@ -196,7 +195,7 @@ int append_fragment_nonoptimizing(char a const String::Language lang=(String::Language)(unsigned char)alang; // The core idea: tainted pieces got marked with context's lang info->dest_languages->append(info->dest_body_plan_length, - lang==String::Language::L_TAINTED? + lang==String::L_TAINTED? info->lang :lang, asize); @@ -222,7 +221,7 @@ String& String::append_to(String& dest, else if(forced) //forcing passed lang? dest.langs.append(dest.body, lang, length()); else { - Append_fragment_info info={lang, dest.body, &dest.langs, dest.body.length()}; + Append_fragment_info info={lang, &dest.langs, dest.body.length()}; langs.for_each(body, lang&L_OPTIMIZE_BIT? append_fragment_optimizing :append_fragment_nonoptimizing, &info); @@ -314,7 +313,7 @@ struct Cstr_to_string_body_block_info { String::Language lang; SQL_Connection* connection; const Request_charsets* charsets; - const StringBody* body; + const String::Body* body; // output CORD_ec result; @@ -332,15 +331,15 @@ int cstr_to_string_body_block(char alang //fprintf(stderr, "%d, %d\n", fragment.lang, fragment.length); - String::Language to_lang=info->lang==String::Language::L_UNSPECIFIED?fragment_lang:info->lang; - bool optimize=(to_lang & String::Language::L_OPTIMIZE_BIT)!=0; + String::Language to_lang=info->lang==String::L_UNSPECIFIED?fragment_lang:info->lang; + bool optimize=(to_lang & String::L_OPTIMIZE_BIT)!=0; if(!optimize) whitespace=false; - switch(to_lang & ~String::Language::L_OPTIMIZE_BIT) { - case String::Language::L_CLEAN: - case String::Language::L_TAINTED: - case String::Language::L_AS_IS: + switch(to_lang & ~String::L_OPTIMIZE_BIT) { + case String::L_CLEAN: + case String::L_TAINTED: + case String::L_AS_IS: // clean piece // tainted piece, but undefined untaint language @@ -350,7 +349,7 @@ int cstr_to_string_body_block(char alang // tainted, untaint language: as-is ec_append(info->result, optimize, whitespace, info->pos, fragment_length); break; - case String::Language::L_FILE_SPEC: + case String::L_FILE_SPEC: // tainted, untaint language: file [name] escape( // Macintosh has problems with small Russian letter 'r' @@ -361,7 +360,7 @@ int cstr_to_string_body_block(char alang encode(need_file_encode, '_', c); ); break; - case String::Language::L_URI: + case String::L_URI: // tainted, untaint language: uri { const char *fragment_str=info->body->mid(info->fragment_begin, fragment_length).cstr(); @@ -378,13 +377,13 @@ int cstr_to_string_body_block(char alang encode(need_uri_encode, '%', c); } break; - case String::Language::L_HTTP_HEADER: + case String::L_HTTP_HEADER: // tainted, untaint language: http-field-content-text escape( encode(need_uri_encode, '%', c); ); break; - case String::Language::L_MAIL_HEADER: + case String::L_MAIL_HEADER: // tainted, untaint language: mail-header // http://www.ietf.org/rfc/rfc2047.txt if(info->charsets) { @@ -430,7 +429,7 @@ int cstr_to_string_body_block(char alang } else ec_append(info->result, optimize, whitespace, info->pos, fragment_length); break; - case String::Language::L_TABLE: + case String::L_TABLE: // tainted, untaint language: table escape(switch(c) { case '\t': to_char(' '); break; @@ -439,7 +438,7 @@ int cstr_to_string_body_block(char alang }); break; #ifdef PA_SQL - case String::Language::L_SQL: + case String::L_SQL: // tainted, untaint language: sql if(info->connection) { const char *fragment_str=info->body->mid(info->fragment_begin, fragment_length).cstr(); @@ -453,7 +452,7 @@ int cstr_to_string_body_block(char alang "untaint in SQL language failed - no connection specified"); break; #endif - case String::Language::L_JS: + case String::L_JS: escape(switch(c) { case '"': to_string("\\\""); break; case '\'': to_string("\\'"); break; @@ -463,7 +462,7 @@ int cstr_to_string_body_block(char alang _default; }); break; - case String::Language::L_XML: + case String::L_XML: escape(switch(c) { case '&': to_string("&"); break; case '>': to_string(">"); break; @@ -473,7 +472,7 @@ int cstr_to_string_body_block(char alang _default; }); break; - case String::Language::L_HTML: + case String::L_HTML: escape(switch(c) { case '&': to_string("&"); break; case '>': to_string(">"); break; @@ -495,7 +494,7 @@ int cstr_to_string_body_block(char alang } -StringBody String::cstr_to_string_body(Language lang, +String::Body String::cstr_to_string_body(Language lang, SQL_Connection* connection, const Request_charsets *charsets) const { @@ -515,5 +514,5 @@ StringBody String::cstr_to_string_body(L if(!is_empty()) langs.for_each(body, cstr_to_string_body_block, &info); - return StringBody(CORD_ec_to_cord(info.result)); + return String::Body(CORD_ec_to_cord(info.result)); }