--- parser3/src/main/untaint.C 2015/10/03 00:03:49 1.167 +++ parser3/src/main/untaint.C 2016/10/26 16:40:50 1.171 @@ -1,11 +1,11 @@ /** @file Parser: String class part: untaint mechanizm. - Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2015 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ -volatile const char * IDENT_UNTAINT_C="$Id: untaint.C,v 1.167 2015/10/03 00:03:49 moko Exp $"; +volatile const char * IDENT_UNTAINT_C="$Id: untaint.C,v 1.171 2016/10/26 16:40:50 moko Exp $"; #include "pa_string.h" @@ -72,7 +72,7 @@ extern "C" { // author forgot to do that } #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; } +#define to_string(s) { CORD_ec_append_cord(info->result, (CORD)(s)); whitespace=false; } #define _default CORD_ec_append(info->result, c) inline bool need_file_encode(unsigned char c){ @@ -179,6 +179,25 @@ int append_fragment_nonoptimizing(char a return 0; // 0=continue } + +/** + appends to other String without language change +*/ + +String& String::append_to(String& dest) const { + if(is_empty()) + return dest; + + // first: fragment infos + dest.langs.appendHelper(dest.body, langs, body); + + // next: letters + dest.body<body->mid(info->fragment_begin, fragment_length).cstr(); - // skip source [we use recoded version] - pa_CORD_pos_advance(info->pos, fragment_length); - String::C output(fragment_str, fragment_length); - if(info->charsets) - output=Charset::transcode(output, - info->charsets->source(), - info->charsets->client()); - - char c; - for(const char* src=output.str; (c=*src++); ) - encode(need_uri_encode, '%', c); + // tainted, untaint language: uri + { + const char *fragment_str=info->body->mid(info->fragment_begin, fragment_length).cstr(); + // skip source [we use recoded version] + pa_CORD_pos_advance(info->pos, fragment_length); + String::C output(fragment_str, fragment_length); + if(info->charsets) + output=Charset::transcode(output, info->charsets->source(), info->charsets->client()); + + char c; + for(const char* src=output.str; (c=*src++); ) + encode(need_uri_encode, '%', c); } break; case String::L_HTTP_HEADER: @@ -541,10 +556,7 @@ int cstr_to_string_body_block(String::La const char *fragment_str=info->body->mid(info->fragment_begin, fragment_length).cstr(); // skip source [we use recoded version] pa_CORD_pos_advance(info->pos, fragment_length); - String::C output(fragment_str, fragment_length); - - output=Charset::escape_JSON(output, info->charsets->source()); - to_string(output); + to_string(Charset::escape_JSON(String::C(fragment_str, fragment_length), info->charsets->source()).str); } } break; @@ -554,10 +566,7 @@ int cstr_to_string_body_block(String::La const char *fragment_str=info->body->mid(info->fragment_begin, fragment_length).cstr(); // skip source [we use recoded version] pa_CORD_pos_advance(info->pos, fragment_length); - String::C output(fragment_str, fragment_length); - - output=Charset::escape(output, info->charsets->source()); - to_string(output); + to_string(Charset::escape(String::C(fragment_str, fragment_length), info->charsets->source()).str); } else ec_append(info->result, optimize, whitespace, info->pos, fragment_length); break;