Diff for /parser3/src/main/untaint.C between versions 1.54 and 1.57

version 1.54, 2001/07/09 16:51:54 version 1.57, 2001/07/28 12:01:50
Line 61  inline bool need_http_header_encode(unsi Line 61  inline bool need_http_header_encode(unsi
         return need_uri_encode(c);          return need_uri_encode(c);
 }  }
   
   //
   
   static const char * String_Untaint_lang_name[]={
           "U", ///< zero value handy for hash lookup @see untaint_lang_name2enum
           "C", ///< clean
           "T",  ///< tainted, untaint language as assigned later 
           // untaint languages. assigned by ^untaint[lang]{...}
           "P",
                   /**<
                           leave language built into string being appended.
                           just a flag, that value not stored
                   */
           "A",     ///< leave all characters intact
           "F", ///< filename
           "H",    ///< text in HTTP response header
           "M",    ///< text in mail header
           "URI",       ///< text in uri
           "T",     ///< ^table:set body
           "SQL",       ///< ^table:sql body
           "JS",        ///< JavaScript code
           "HTML",      ///< HTML code (for editing)
           "UHTML", ///< HTML code with USER chars
   };
   
   
 // String  // String
   
 static bool typo_present(Array::Item *value, const void *info) {  static bool typo_present(Array::Item *value, const void *info) {
Line 116  inline bool need_quote_http_header(const Line 141  inline bool need_quote_http_header(const
         return false;          return false;
 }  }
   
 /// @todo maybe additional check "are all pieces are clean?" would be profitable?  /** @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 {  size_t String::cstr_bufsize(Untaint_lang lang) const {
         return (lang==UL_AS_IS?size():size()*UNTAINT_TIMES_BIGGER) +1;          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 fix theoretical \n mem overrun in TYPO replacements
Line 139  char *String::store_to(char *dest, Untai Line 166  char *String::store_to(char *dest, Untai
                         if(row==append_here)                          if(row==append_here)
                                 goto break2;                                  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, "#%s: ",
                                           String_Untaint_lang_name[to_lang]);
                           }
                           char *dest_after_origins=dest;
   
                         // WARNING:                          // WARNING:
                         //      string can grow only UNTAINT_TIMES_BIGGER                          //      string can grow only UNTAINT_TIMES_BIGGER
                         switch(lang==UL_UNSPECIFIED?row->item.lang:lang) {                          switch(to_lang) {
                         case UL_CLEAN:                          case UL_CLEAN:
                                 // clean piece                                  // clean piece
                                 { // optimizing whitespace                                  { // optimizing whitespace
Line 261  char *String::store_to(char *dest, Untai Line 306  char *String::store_to(char *dest, Untai
                                 break;                                  break;
                         case UL_USER_HTML: {                          case UL_USER_HTML: {
                                 // tainted, untaint language: html-typo                                  // tainted, untaint language: html-typo
                                   if(!typo_table) // never, always has default
                                           THROW(0, 0,
                                                   this,
                                                   "untaint to user-html lang failed, no typo table");
   
                                 char *html_for_typo=                                  char *html_for_typo=
                                         (char *)malloc(row->item.size*2/* '\n' -> '\' 'n' */+1);                                          (char *)malloc(row->item.size*2/* '\n' -> '\' 'n' */+1);
                                 // note:                                  // note:
Line 275  char *String::store_to(char *dest, Untai Line 325  char *String::store_to(char *dest, Untai
                                         escape(switch(*src) {                                          escape(switch(*src) {
                                                 // convinient name for typo match "\n"                                                  // convinient name for typo match "\n"
                                                 case '\r':                                                   case '\r': 
                                                         if(typo_table) {                                                          to_string("\\n", 2); // \r -> "\n"
                                                                 *dest++='\\';  *dest++='n'; // \r -> \n                                                          if(size && src[1]=='\n') { // \r\n -> remove \n
                                                                 if(src[1]=='\n') { // \r\n -> remove \n                                                                  size--; src++;
                                                                         size--; src++;  
                                                                 }  
                                                         }                                                          }
                                                         break;                                                          break;
                                                 case '\n':                                                   case '\n': 
                                                         if(typo_table)                                                          to_string("\\n", 2);
                                                                 to_string("\\n", 2);  
                                                         break;                                                          break;
                                                 //TODO: XSLT case '\'': to_string("&apos;", 6);  break;                                                  //TODO: XSLT case '\'': to_string("&apos;", 6);  break;
                                                 _default;                                                  _default;
Line 341  char *String::store_to(char *dest, Untai Line 388  char *String::store_to(char *dest, Untai
   
                         if((lang==UL_UNSPECIFIED?row->item.lang:lang)!=UL_CLEAN)                          if((lang==UL_UNSPECIFIED?row->item.lang:lang)!=UL_CLEAN)
                                 whitespace=false;                                  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; p<dest; p++)
                                                   if(*p=='\n')
                                                           *p='|';
   
                                           to_char('\n');
                                   }
                 }                  }
                 chunk=row->link;                  chunk=row->link;
         } while(chunk);          } while(chunk);

Removed from v.1.54  
changed lines
  Added in v.1.57


E-mail: