Diff for /parser3/src/main/untaint.C between versions 1.115.2.12.2.18 and 1.115.2.12.2.25

version 1.115.2.12.2.18, 2003/03/27 10:53:01 version 1.115.2.12.2.25, 2003/04/08 12:47:31
Line 17  static const char* IDENT_UNTAINT_C="$Dat Line 17  static const char* IDENT_UNTAINT_C="$Dat
 #include "pa_common.h"  #include "pa_common.h"
 #include "pa_charset.h"  #include "pa_charset.h"
 #include "pa_request_charsets.h"  #include "pa_request_charsets.h"
   #include "pa_sapi.h"
   
 extern "C" { // author forgot to do that  extern "C" { // author forgot to do that
 #include "ec.h"  #include "ec.h"
Line 28  extern "C" { // author forgot to do that Line 29  extern "C" { // author forgot to do that
 #include "pa_sql_connection.h"  #include "pa_sql_connection.h"
 #endif  #endif
   
 // forwards  
   
 void CORD_ec_flush_buf_optimize_whitespace(CORD_ec x);  
   
 // defines  // defines
   
   
Line 186  String& String::append_to(String& dest, Line 183  String& String::append_to(String& dest,
   
         // next: fragment infos          // next: fragment infos
                   
         if(lang==L_PASS_APPENDED) // without language-chage string?          if(lang==L_PASS_APPENDED) // without language-change?
                 dest.fragments.append(fragments);                  dest.fragments.append(fragments);
         else if(forced) //forcing passed lang?          else if(forced) //forcing passed lang?
                 dest.fragments+=Fragment(lang, length());                  dest.fragments+=Fragment(lang, length());
         else if(lang&L_OPTIMIZE_BIT) {          else if(lang&L_OPTIMIZE_BIT) {
                 Array_iterator<ArrayFragment::element_type> i(fragments);                  for(Array_iterator<ArrayFragment::element_type> i(fragments); i.has_next(); ) {
                 while(i.has_next()) {  
                         const Fragment fragment=i.next();                          const Fragment fragment=i.next();
                         // main idea here:                          // main idea here:
                         // tainted piece would get OPTIMIZED bit from 'lang'                          // tainted piece would get OPTIMIZED bit from 'lang'
Line 205  String& String::append_to(String& dest, Line 201  String& String::append_to(String& dest,
                                 fragment.length);                                  fragment.length);
                 }                  }
         } else { // The core idea: tainted pieces got marked with context's lang          } else { // The core idea: tainted pieces got marked with context's lang
                 Array_iterator<ArrayFragment::element_type> i(fragments);                  for(Array_iterator<ArrayFragment::element_type> i(fragments); i.has_next(); ) {
                 while(i.has_next()) {  
                         const Fragment fragment=i.next();                          const Fragment fragment=i.next();
                         dest.fragments+=Fragment(                          dest.fragments+=Fragment(
                                 fragment.lang==L_TAINTED?lang:fragment.lang,                                  fragment.lang==L_TAINTED?lang:fragment.lang,
Line 214  String& String::append_to(String& dest, Line 209  String& String::append_to(String& dest,
                 }                  }
         }          }
   
   #ifndef NDEBUG
           dest.invariant();
   #endif
   
         return dest;          return dest;
 }  }
   
Line 259  inline bool mail_header_char_valid_withi Line 258  inline bool mail_header_char_valid_withi
 inline bool mail_header_nonspace_char(char c) {  inline bool mail_header_nonspace_char(char c) {
         return c != 0x20;          return c != 0x20;
 }  }
 inline void ec_append(CORD_ec& result, bool& optimize, bool& whitespace, CORD_pos& pos, size_t size) {  inline void ec_append(CORD_ec& result, bool& optimize, bool& whitespace, CORD_pos pos, size_t size) {
         while(size--) {          while(size--) {
                 CORD_ec_append(result, CORD_pos_fetch(pos));                  CORD_ec_append(result, CORD_pos_fetch(pos));
                 CORD_next(pos);                  CORD_next(pos);
         }          }
 }  }
   inline void pa_CORD_pos_advance(CORD_pos pos, size_t n) {
           while(true) {
                   size_t avail=CORD_pos_chars_left(pos);
                   if(avail==0) {
                           CORD_next(pos);
                           if(!--n)
                                   break;
                   } else if(avail<n) {
                           CORD_pos_advance(pos, avail);
                           n-=avail;
                   } else { // avail>=n
                           CORD_pos_advance(pos, n);
                           break;
                   }
           }
   }
 StringBody String::cstr_to_string_body(Language lang,   StringBody String::cstr_to_string_body(Language lang, 
                   SQL_Connection* connection,                    SQL_Connection* connection,
                   const Request_charsets *charsets) const {                    const Request_charsets *charsets) const {
Line 285  StringBody String::cstr_to_string_body(L Line 300  StringBody String::cstr_to_string_body(L
                 bool optimize=(to_lang & L_OPTIMIZE_BIT)!=0;                  bool optimize=(to_lang & L_OPTIMIZE_BIT)!=0;
                 if(!optimize)                  if(!optimize)
                         whitespace=false;                          whitespace=false;
                           
                 switch(to_lang & ~L_OPTIMIZE_BIT) {                  switch(to_lang & ~L_OPTIMIZE_BIT) {
                 case L_CLEAN:                  case L_CLEAN:
                 case L_TAINTED:                  case L_TAINTED:
Line 315  StringBody String::cstr_to_string_body(L Line 330  StringBody String::cstr_to_string_body(L
                         {                          {
                                 const char *fragment_str=body.mid(fragment_begin, fragment_length).cstr();                                  const char *fragment_str=body.mid(fragment_begin, fragment_length).cstr();
                                 // skip source [we use recoded version]                                  // skip source [we use recoded version]
                                 CORD_pos_advance(pos, fragment_length);                                  pa_CORD_pos_advance(pos, fragment_length);
                                 const void *client_ptr;                                  String::C output(fragment_str, fragment_length);
                                 size_t client_size;  
                                 if(charsets)                                   if(charsets) 
                                         Charset::transcode(                                          output=Charset::transcode(output, 
                                                 charsets->source(), fragment_str, fragment_length,                                                  charsets->source(), 
                                                 charsets->client(), client_ptr, client_size);                                                  charsets->client());
                                 else {  
                                         client_ptr=fragment_str;   
                                         client_size=fragment_length;  
                                 }  
   
                                 char c;                                  char c;
                                 for(const char* src=(const char* )client_ptr; c=*src++; )                                   for(const char* src=output.str; c=*src++; ) 
                                         encode(need_uri_encode, '%', c);                                          encode(need_uri_encode, '%', c);
                         }                          }
                         break;                          break;
Line 346  StringBody String::cstr_to_string_body(L Line 356  StringBody String::cstr_to_string_body(L
                                 const char *mail_ptr=                                  const char *mail_ptr=
                                         body.mid(fragment_begin, mail_size=fragment_length).cstr();                                          body.mid(fragment_begin, mail_size=fragment_length).cstr();
                                 // skip source [we use recoded version]                                  // skip source [we use recoded version]
                                 CORD_pos_advance(pos, mail_size);                                  pa_CORD_pos_advance(pos, mail_size);
   
                                 const char* charset_name=charsets->mail().name().cstr();                                  const char* charset_name=charsets->mail().name().cstr();
   
Line 398  StringBody String::cstr_to_string_body(L Line 408  StringBody String::cstr_to_string_body(L
                         if(connection) {                          if(connection) {
                                 const char *fragment_str=body.mid(fragment_begin, fragment_length).cstr();                                  const char *fragment_str=body.mid(fragment_begin, fragment_length).cstr();
                                 // skip source [we use recoded version]                                  // skip source [we use recoded version]
                                 CORD_pos_advance(pos, fragment_length);                                  pa_CORD_pos_advance(pos, fragment_length);
   
                                 to_string(connection->quote(fragment_str, fragment_length));                                  to_string(connection->quote(fragment_str, fragment_length));
                         } else                          } else
Line 437  StringBody String::cstr_to_string_body(L Line 447  StringBody String::cstr_to_string_body(L
                         });                          });
                         break;                          break;
                 default:                  default:
                         throw Exception(0,                           SAPI::die("unknown untaint language #%d", 
                                 0,                                   static_cast<int>(to_lang)); // should never
                                 "unknown untaint language #%d",   
                                         static_cast<int>(to_lang)); // should never  
                         break; // never                          break; // never
                 }                  }
         }          }

Removed from v.1.115.2.12.2.18  
changed lines
  Added in v.1.115.2.12.2.25


E-mail: