--- parser3/src/main/untaint.C 2001/04/28 13:38:15 1.47 +++ parser3/src/main/untaint.C 2001/07/18 10:06:04 1.55 @@ -4,11 +4,8 @@ Copyright(c) 2001 ArtLebedev Group(http://www.artlebedev.com) Author: Alexander Petrosyan (http://design.ru/paf) - - $Id: untaint.C,v 1.47 2001/04/28 13:38:15 paf Exp $ */ - -#include "pa_config_includes.h" +static const char *RCSId="$Id: untaint.C,v 1.55 2001/07/18 10:06:04 parser Exp $"; #include "pa_pool.h" #include "pa_string.h" @@ -119,8 +116,15 @@ inline bool need_quote_http_header(const return false; } -/** - @todo fix theoretical \n mem overrun in TYPO replacements +/** @todo maybe additional check "are all pieces are clean?" would be profitable? + @todo fix potential forigins_mode buf overrun +*/ +size_t String::cstr_bufsize(Untaint_lang lang) const { + return (lang==UL_AS_IS?size():size()*UNTAINT_TIMES_BIGGER*(forigins_mode?10:1)) +1; +} + +/** @todo fix theoretical \n mem overrun in TYPO replacements +@todo rename base_64 to quoted_printable [invalid name now] */ char *String::store_to(char *dest, Untaint_lang lang, SQL_Connection *connection, @@ -137,9 +141,27 @@ char *String::store_to(char *dest, Untai if(row==append_here) goto break2; + Untaint_lang to_lang=lang==UL_UNSPECIFIED?row->item.lang:lang; + + char *dest_before_origins=dest; + + if(forigins_mode) { +#ifndef NO_STRING_ORIGIN + if(row->item.origin.file) + dest+=sprintf(dest, "%s(%d)", + row->item.origin.file, + 1+row->item.origin.line); + else + dest+=sprintf(dest, "unknown"); +#endif + dest+=sprintf(dest, "#%d: ", + to_lang); + } + char *dest_after_origins=dest; + // WARNING: // string can grow only UNTAINT_TIMES_BIGGER - switch(lang==UL_UNSPECIFIED?row->item.lang:lang) { + switch(to_lang) { case UL_CLEAN: // clean piece { // optimizing whitespace @@ -259,7 +281,8 @@ char *String::store_to(char *dest, Untai break; case UL_USER_HTML: { // tainted, untaint language: html-typo - char *html_for_typo=(char *)malloc(size()*2/* '\n' -> '\' 'n' */+1); + char *html_for_typo= + (char *)malloc(row->item.size*2/* '\n' -> '\' 'n' */+1); // note: // there still is a possibility that user // would not replace \n as she supposed to @@ -312,9 +335,9 @@ char *String::store_to(char *dest, Untai &b, "is %g times longer then '%s', " "while maximum, handled by Parser, is %d", - ((double)b.size())/a.size(), - a.cstr(), - UNTAINT_TIMES_BIGGER); + ((double)b.size())/a.size(), + a.cstr(), + UNTAINT_TIMES_BIGGER); } // skip 'a' in 'src' @@ -333,10 +356,22 @@ char *String::store_to(char *dest, Untai "unknown untaint language #%d of %d piece", static_cast(row->item.lang), i); // never + break; // never } if((lang==UL_UNSPECIFIED?row->item.lang:lang)!=UL_CLEAN) whitespace=false; + + if(forigins_mode) + if(dest==dest_after_origins) // never moved==optimized space + dest=dest_before_origins; + else { + for(char *p=dest_after_origins; plink; } while(chunk);