--- parser3/src/main/untaint.C 2003/08/15 11:40:45 1.117.2.1 +++ parser3/src/main/untaint.C 2003/09/23 09:54:28 1.118.2.1 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_UNTAINT_C="$Date: 2003/08/15 11:40:45 $"; +static const char* IDENT_UNTAINT_C="$Date: 2003/09/23 09:54:28 $"; #include "pa_string.h" @@ -167,6 +167,40 @@ inline bool need_quote_http_header(const return false; } +#ifndef DOXYGEN +struct Append_fragment_info { + String::Language lang; + const StringBody dest_body; + String::Languages* dest_languages; +}; +#endif +int append_fragment_optimizing(char alang, size_t asize, Append_fragment_info& info) { + String::Language lang=(String::Language)alang; + // main idea here: + // tainted piece would get OPTIMIZED bit from 'lang' + // 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, + lang==String::Language::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, + asize); + + return 0; // 0=continue +} +int append_fragment_nonoptimizing(char alang, size_t asize, Append_fragment_info& info) { + String::Language lang=(String::Language)alang; + // The core idea: tainted pieces got marked with context's lang + info.dest_languages->append(info.dest_body, + lang==String::Language::L_TAINTED? + info.lang + :lang, + asize); + + return 0; // 0=continue +} /** appends to other String, @@ -178,38 +212,22 @@ String& String::append_to(String& dest, if(is_empty()) return dest; - // first: letters - dest.body< i(fragments); i.has_next(); ) { - const Fragment fragment=i.next(); - // main idea here: - // tainted piece would get OPTIMIZED bit from 'lang' - // clean piece would be marked OPTIMIZED manually - // pieces with determined languages [not tainted|clean] would retain theirs langs - dest.fragments+=Fragment(static_cast( - fragment.lang==L_TAINTED?lang:( - fragment.lang==L_CLEAN?L_CLEAN|L_OPTIMIZE_BIT: // ORing with OPTIMIZED flag - fragment.lang)), - fragment.length); - } - } else { // The core idea: tainted pieces got marked with context's lang - for(Array_iterator i(fragments); i.has_next(); ) { - const Fragment fragment=i.next(); - dest.fragments+=Fragment( - fragment.lang==L_TAINTED?lang:fragment.lang, - fragment.length); - } + dest.langs.append(dest.body, lang, length()); + else { + Append_fragment_info info={lang, dest.body, &dest.langs}; + langs.for_each(body, lang&L_OPTIMIZE_BIT? + append_fragment_optimizing + :append_fragment_nonoptimizing, info); } - ASSERT_STRING_INVARIANT(dest); + // next: letters + dest.body<