mirror of
https://github.com/rakshasa/rtorrent.git
synced 2026-08-08 11:12:31 +00:00
Add size limit to XML-RPC documents, defaulting to max SCGI size
This commit is contained in:
+11
-5
@@ -37,6 +37,8 @@
|
||||
#ifndef RTORRENT_RPC_XMLRPC_H
|
||||
#define RTORRENT_RPC_XMLRPC_H
|
||||
|
||||
#include "scgi_task.h"
|
||||
|
||||
#include <functional>
|
||||
|
||||
#include <torrent/hash_string.h>
|
||||
@@ -74,7 +76,7 @@ public:
|
||||
static const int call_file = 5;
|
||||
static const int call_file_itr = 6;
|
||||
|
||||
XmlRpc() : m_env(NULL), m_registry(NULL), m_dialect(dialect_i8) {}
|
||||
XmlRpc() : m_env(NULL), m_registry(NULL), m_dialect(dialect_i8), m_sizeLimit(SCgiTask::max_content_size) {}
|
||||
|
||||
bool is_valid() const;
|
||||
|
||||
@@ -97,17 +99,21 @@ public:
|
||||
void set_size_limit(uint64_t size);
|
||||
|
||||
private:
|
||||
slot_download m_slotFindDownload;
|
||||
slot_file m_slotFindFile;
|
||||
slot_tracker m_slotFindTracker;
|
||||
slot_peer m_slotFindPeer;
|
||||
|
||||
// Only used by xmlrpc-c
|
||||
void* m_env;
|
||||
void* m_registry;
|
||||
|
||||
int m_dialect;
|
||||
|
||||
// Only used by tinyxml2
|
||||
bool m_isValid;
|
||||
uint64_t m_sizeLimit;
|
||||
|
||||
slot_download m_slotFindDownload;
|
||||
slot_file m_slotFindFile;
|
||||
slot_tracker m_slotFindTracker;
|
||||
slot_peer m_slotFindPeer;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -423,6 +423,11 @@ print_xmlrpc_fault(int faultCode, std::string faultString, tinyxml2::XMLPrinter*
|
||||
|
||||
bool
|
||||
XmlRpc::process(const char* inBuffer, uint32_t length, slot_write slotWrite) {
|
||||
if (length > m_sizeLimit) {
|
||||
tinyxml2::XMLPrinter printer(nullptr, true, 0);
|
||||
print_xmlrpc_fault(XMLRPC_LIMIT_EXCEEDED_ERROR, "Content size exceeds maximum XML-RPC limit", &printer);
|
||||
return slotWrite(printer.CStr(), printer.CStrSize()-1);
|
||||
}
|
||||
tinyxml2::XMLDocument doc;
|
||||
doc.Parse(inBuffer, length);
|
||||
try {
|
||||
@@ -449,8 +454,8 @@ void XmlRpc::cleanup() {}
|
||||
void XmlRpc::insert_command(const char*, const char*, const char*) {}
|
||||
void XmlRpc::set_dialect(int) {}
|
||||
|
||||
int64_t XmlRpc::size_limit() { return std::numeric_limits<int64_t>::max(); }
|
||||
void XmlRpc::set_size_limit(uint64_t) {}
|
||||
int64_t XmlRpc::size_limit() { return m_sizeLimit; }
|
||||
void XmlRpc::set_size_limit(uint64_t limit) { m_sizeLimit = limit; }
|
||||
|
||||
bool XmlRpc::is_valid() const { return m_isValid; }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user