Changeset 1093

Show
Ignore:
Timestamp:
05/16/09 08:59:54 (3 years ago)
Author:
rakshasa
Message:

* Fix crashes/errors due to rtorrent attempting to pass non-utf-8 strings to xmlrpc. Patch by Josef Drexler.

* Disabled strict ordering check for the bencode decoder added 2 revisions ago, as it might be messing up PEX, etc.

Location:
trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/libtorrent/src/torrent/object_stream.cc

    r1088 r1093  
    108108      break; 
    109109 
    110     Object::string_type last; 
     110    //    Object::string_type last; 
    111111 
    112112    while (input->good()) { 
     
    121121        break; 
    122122 
    123       if (last >= str) 
    124         break; 
     123      //      if (last >= str) 
     124      //        break; 
    125125 
    126126      object_read_bencode(input, &object->as_map()[str], depth); 
    127127 
    128       str.swap(last); 
     128      //      str.swap(last); 
    129129    } 
    130130 
     
    203203      output->buffer = output->writeFunc(output->data, output->buffer); 
    204204      output->pos = output->buffer.first; 
     205 
     206      //      if (output->buffer.first == output->buffer.second) 
     207      //        return; 
    205208    } 
    206209 
     
    298301  object_write_bencode_c_object(&output, object); 
    299302 
     303  //  if (output->buffer.first == output->buffer.second) 
     304  //    throw  
     305 
    300306  // Don't flush the buffer. 
    301307  if (output.pos == output.buffer.first) 
  • trunk/rtorrent/src/rpc/xmlrpc.cc

    r1092 r1093  
    372372 
    373373  case torrent::Object::TYPE_STRING: 
    374     return xmlrpc_string_new(env, object.as_string().c_str()); 
     374  { 
     375#ifdef XMLRPC_HAVE_I8 
     376    // The versions that support I8 do implicit utf-8 validation. 
     377    xmlrpc_value* result = xmlrpc_string_new(env, object.as_string().c_str()); 
     378#else 
     379    // In older versions, xmlrpc-c doesn't validate the utf-8 encoding itself. 
     380    xmlrpc_validate_utf8(env, object.as_string().c_str(), object.as_string().length()); 
     381 
     382    xmlrpc_value* result = env->fault_occurred ? NULL : xmlrpc_string_new(env, object.as_string().c_str()); 
     383#endif 
     384 
     385    if (env->fault_occurred) { 
     386      xmlrpc_env_clean(env); 
     387      xmlrpc_env_init(env); 
     388 
     389      const std::string& str = object.as_string(); 
     390      char buffer[str.size() + 1]; 
     391      char* dst = buffer; 
     392      for (std::string::const_iterator itr = str.begin(); itr != str.end(); ++itr) 
     393        *dst++ = ((*itr < 0x20 && *itr != '\r' && *itr != '\n' && *itr != '\t') || (*itr & 0x80)) ? '?' : *itr; 
     394      *dst = 0; 
     395 
     396      result = xmlrpc_string_new(env, buffer); 
     397    } 
     398 
     399    return result; 
     400  } 
    375401 
    376402  case torrent::Object::TYPE_LIST: