1 # Fix crashes/errors due to rtorrent attempting to pass non-utf-8 strings to xmlrpc.
3 Index: rtorrent/src/rpc/xmlrpc.cc
4 ===================================================================
5 --- rtorrent/src/rpc/xmlrpc.cc (revision 1078)
6 +++ rtorrent/src/rpc/xmlrpc.cc (working copy)
10 case torrent::Object::TYPE_STRING:
11 - return xmlrpc_string_new(env, object.as_string().c_str());
13 +#ifdef XMLRPC_HAVE_I8
14 + // The versions that support I8 do implicit utf-8 validation.
15 + xmlrpc_value* result = xmlrpc_string_new(env, object.as_string().c_str());
17 + // In older versions, xmlrpc-c doesn't validate the utf-8 encoding itself.
18 + xmlrpc_validate_utf8(env, object.as_string().c_str(), object.as_string().length());
20 + xmlrpc_value* result = env->fault_occurred ? NULL : xmlrpc_string_new(env, object.as_string().c_str());
23 + if (env->fault_occurred) {
24 + xmlrpc_env_clean(env);
25 + xmlrpc_env_init(env);
27 + const std::string& str = object.as_string();
28 + char buffer[str.size() + 1];
30 + for (std::string::const_iterator itr = str.begin(); itr != str.end(); ++itr)
31 + *dst++ = ((*itr < 0x20 && *itr != '\r' && *itr != '\n' && *itr != '\t') || (*itr & 0x80)) ? '?' : *itr;
34 + result = xmlrpc_string_new(env, buffer);
40 case torrent::Object::TYPE_LIST:
42 xmlrpc_value* result = xmlrpc_array_new(env);