[package] update rtorrent to 0.8.4-svn1087 (#4851)
[openwrt/svn-archive/archive.git] / net / rtorrent / patches / 800-fix-xmlrpc-utf8.diff
1 # Fix crashes/errors due to rtorrent attempting to pass non-utf-8 strings to xmlrpc.
2 # by jdrexler
3 Index: rtorrent/src/rpc/xmlrpc.cc
4 ===================================================================
5 --- rtorrent/src/rpc/xmlrpc.cc (revision 1078)
6 +++ rtorrent/src/rpc/xmlrpc.cc (working copy)
7 @@ -371,8 +371,34 @@
8 #endif
9
10 case torrent::Object::TYPE_STRING:
11 - return xmlrpc_string_new(env, object.as_string().c_str());
12 + {
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());
16 +#else
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());
19
20 + xmlrpc_value* result = env->fault_occurred ? NULL : xmlrpc_string_new(env, object.as_string().c_str());
21 +#endif
22 +
23 + if (env->fault_occurred) {
24 + xmlrpc_env_clean(env);
25 + xmlrpc_env_init(env);
26 +
27 + const std::string& str = object.as_string();
28 + char buffer[str.size() + 1];
29 + char* dst = buffer;
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;
32 + *dst = 0;
33 +
34 + result = xmlrpc_string_new(env, buffer);
35 + }
36 +
37 + return result;
38 + }
39 +
40 case torrent::Object::TYPE_LIST:
41 {
42 xmlrpc_value* result = xmlrpc_array_new(env);