diff --git a/src/rpc/exec_file.cc b/src/rpc/exec_file.cc index 4607eaf6..bd5593d2 100644 --- a/src/rpc/exec_file.cc +++ b/src/rpc/exec_file.cc @@ -38,6 +38,7 @@ #include #include +#include #include #include #include @@ -90,8 +91,12 @@ ExecFile::execute(const char* file, char* const* argv) { } else { int status; + int wpid = waitpid(childPid, &status, 0); - if (waitpid(childPid, &status, 0) != childPid) + while (wpid == -1 && rak::error_number::current().value() == rak::error_number::e_intr) + wpid = waitpid(childPid, &status, 0); + + if (wpid != childPid) throw torrent::internal_error("ExecFile::execute(...) waitpid failed."); // Check return value? diff --git a/src/rpc/parse.cc b/src/rpc/parse.cc index 185d8a60..d6c77749 100644 --- a/src/rpc/parse.cc +++ b/src/rpc/parse.cc @@ -373,7 +373,7 @@ print_object(char* first, char* last, const torrent::Object* src, int flags) { } case torrent::Object::TYPE_VALUE: - return std::max(first + snprintf(first, std::distance(first, last), "%lli", src->as_value()), last); + return std::min(first + snprintf(first, std::distance(first, last), "%lli", src->as_value()), last); case torrent::Object::TYPE_LIST: for (torrent::Object::list_const_iterator itr = src->as_list().begin(), itrEnd = src->as_list().end(); itr != itrEnd; itr++) { diff --git a/src/rpc/xmlrpc.cc b/src/rpc/xmlrpc.cc index 0cc89eb9..30551187 100644 --- a/src/rpc/xmlrpc.cc +++ b/src/rpc/xmlrpc.cc @@ -377,8 +377,11 @@ object_to_xmlrpc(xmlrpc_env* env, const torrent::Object& object) { { xmlrpc_value* result = xmlrpc_array_new(env); - for (torrent::Object::list_const_iterator itr = object.as_list().begin(), last = object.as_list().end(); itr != last; itr++) - xmlrpc_array_append_item(env, result, object_to_xmlrpc(env, *itr)); + for (torrent::Object::list_const_iterator itr = object.as_list().begin(), last = object.as_list().end(); itr != last; itr++) { + xmlrpc_value* item = object_to_xmlrpc(env, *itr); + xmlrpc_array_append_item(env, result, item); + xmlrpc_DECREF(item); + } return result; } @@ -387,8 +390,11 @@ object_to_xmlrpc(xmlrpc_env* env, const torrent::Object& object) { { xmlrpc_value* result = xmlrpc_struct_new(env); - for (torrent::Object::map_const_iterator itr = object.as_map().begin(), last = object.as_map().end(); itr != last; itr++) - xmlrpc_struct_set_value(env, result, itr->first.c_str(), object_to_xmlrpc(env, itr->second)); + for (torrent::Object::map_const_iterator itr = object.as_map().begin(), last = object.as_map().end(); itr != last; itr++) { + xmlrpc_value* item = object_to_xmlrpc(env, itr->second); + xmlrpc_struct_set_value(env, result, itr->first.c_str(), item); + xmlrpc_DECREF(item); + } return result; }