--- parser3/src/main/untaint.C 2003/09/23 13:53:04 1.118.2.3 +++ parser3/src/main/untaint.C 2003/09/23 14:07:49 1.118.2.5 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_UNTAINT_C="$Date: 2003/09/23 13:53:04 $"; +static const char* IDENT_UNTAINT_C="$Date: 2003/09/23 14:07:49 $"; #include "pa_string.h" @@ -176,7 +176,7 @@ struct Append_fragment_info { }; #endif int append_fragment_optimizing(char alang, size_t asize, Append_fragment_info* info) { - const String::Language lang=(String::Language)alang; + const String::Language lang=(String::Language)(unsigned char)alang; // main idea here: // tainted piece would get OPTIMIZED bit from 'lang' // clean piece would be marked OPTIMIZED manually @@ -193,7 +193,7 @@ int append_fragment_optimizing(char alan return 0; // 0=continue } int append_fragment_nonoptimizing(char alang, size_t asize, Append_fragment_info* info) { - const String::Language lang=(String::Language)alang; + 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? @@ -326,7 +326,7 @@ struct Cstr_to_string_body_block_info { }; #endif int cstr_to_string_body_block(char alang, size_t fragment_length, Cstr_to_string_body_block_info* info) { - const String::Language fragment_lang=(String::Language)alang; + const String::Language fragment_lang=(String::Language)(unsigned char)alang; bool& whitespace=info->whitespace; size_t fragment_end=info->fragment_begin+fragment_length; //fprintf(stderr, "%d, %d\n", fragment.lang, fragment.length); @@ -483,6 +483,7 @@ int cstr_to_string_body_block(char alang }); break; default: + assert(!"should never"); SAPI::die("unknown untaint language #%d", static_cast(to_lang)); // should never break; // never @@ -510,8 +511,9 @@ StringBody String::cstr_to_string_body(L body.set_pos(info.pos, 0); info.fragment_begin=0; info.whitespace=true; - - langs.for_each(body, cstr_to_string_body_block, &info); + + if(!is_empty()) + langs.for_each(body, cstr_to_string_body_block, &info); return StringBody(CORD_ec_to_cord(info.result)); }