From b19bc576c4c4bc8e5db4936c652b25bba6d7e3bc Mon Sep 17 00:00:00 2001 From: rakshasa Date: Sat, 16 May 2009 12:59:54 +0000 Subject: [PATCH] * 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. git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@1093 e378c898-3ddf-0310-93e7-cc216c733640 --- src/rpc/xmlrpc.cc | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/rpc/xmlrpc.cc b/src/rpc/xmlrpc.cc index aac87a58..5b5699d4 100644 --- a/src/rpc/xmlrpc.cc +++ b/src/rpc/xmlrpc.cc @@ -371,7 +371,33 @@ object_to_xmlrpc(xmlrpc_env* env, const torrent::Object& object) { #endif case torrent::Object::TYPE_STRING: - return xmlrpc_string_new(env, object.as_string().c_str()); + { +#ifdef XMLRPC_HAVE_I8 + // The versions that support I8 do implicit utf-8 validation. + xmlrpc_value* result = xmlrpc_string_new(env, object.as_string().c_str()); +#else + // In older versions, xmlrpc-c doesn't validate the utf-8 encoding itself. + xmlrpc_validate_utf8(env, object.as_string().c_str(), object.as_string().length()); + + xmlrpc_value* result = env->fault_occurred ? NULL : xmlrpc_string_new(env, object.as_string().c_str()); +#endif + + if (env->fault_occurred) { + xmlrpc_env_clean(env); + xmlrpc_env_init(env); + + const std::string& str = object.as_string(); + char buffer[str.size() + 1]; + char* dst = buffer; + for (std::string::const_iterator itr = str.begin(); itr != str.end(); ++itr) + *dst++ = ((*itr < 0x20 && *itr != '\r' && *itr != '\n' && *itr != '\t') || (*itr & 0x80)) ? '?' : *itr; + *dst = 0; + + result = xmlrpc_string_new(env, buffer); + } + + return result; + } case torrent::Object::TYPE_LIST: {