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.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • 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: