From 16bfaf2694c362e8430f6bf7b7e356a6fe8b5a82 Mon Sep 17 00:00:00 2001 From: xirvik Date: Wed, 26 Aug 2026 14:27:06 +0000 Subject: [PATCH] Reject an XMLRPC size limit above the SCGI content size limit. --- src/rpc/rpc_manager.cc | 8 ++++++++ src/rpc/rpc_manager.h | 2 +- src/rpc/xmlrpc_c.cc | 3 --- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/rpc/rpc_manager.cc b/src/rpc/rpc_manager.cc index 6e9cd5c5..39faf7a1 100644 --- a/src/rpc/rpc_manager.cc +++ b/src/rpc/rpc_manager.cc @@ -167,6 +167,14 @@ RpcManager::cleanup() { m_jsonrpc.cleanup(); } +void +RpcManager::set_size_limit(uint64_t size) { + if (size > SCgiTask::max_content_size) + throw torrent::input_error("XMLRPC size limit cannot exceed the SCGI content size limit."); + + m_xmlrpc.set_size_limit(size); +} + void RpcManager::insert_command(const char* name, const char* parm, const char* doc) { m_xmlrpc.insert_command(name, parm, doc); diff --git a/src/rpc/rpc_manager.h b/src/rpc/rpc_manager.h index beb99647..e9b84b8c 100644 --- a/src/rpc/rpc_manager.h +++ b/src/rpc/rpc_manager.h @@ -62,7 +62,7 @@ public: void cleanup(); int64_t size_limit() { return m_xmlrpc.size_limit(); }; - void set_size_limit(uint64_t size) { m_xmlrpc.set_size_limit(size); }; + void set_size_limit(uint64_t size); int dialect() { return m_xmlrpc.dialect(); } void set_dialect(int dialect) { m_xmlrpc.set_dialect(dialect); } diff --git a/src/rpc/xmlrpc_c.cc b/src/rpc/xmlrpc_c.cc index ab04166d..08544b03 100644 --- a/src/rpc/xmlrpc_c.cc +++ b/src/rpc/xmlrpc_c.cc @@ -529,9 +529,6 @@ XmlRpc::size_limit() { void XmlRpc::set_size_limit(uint64_t size) { - if (size >= (64 << 20)) - throw torrent::input_error("Invalid XMLRPC limit size."); - xmlrpc_limit_set(XMLRPC_XML_SIZE_LIMIT_ID, size); }