summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-02-26 21:49:37 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-02-26 21:49:37 +0900
commitf4e0eae904ff94af3f6b80cbfc3175cb4b24c2cd (patch)
treedb262cf5974adc5106e821fac9fa78fc2aa42d93
parentad11d746f09977ce151ef6f49dd971f4af451d44 (diff)
Added checkRequiredInteger() to check integer param is in valid range.
Ensure that fileIndex in aria2.changeUri RPC method is greater than or equal to 1.
-rw-r--r--src/RpcMethodImpl.cc2
-rw-r--r--src/RpcMethodImpl.h36
-rw-r--r--test/RpcMethodTest.cc6
3 files changed, 39 insertions, 5 deletions
diff --git a/src/RpcMethodImpl.cc b/src/RpcMethodImpl.cc
index f351f2a9..fd190773 100644
--- a/src/RpcMethodImpl.cc
+++ b/src/RpcMethodImpl.cc
@@ -1392,7 +1392,7 @@ SharedHandle<ValueBase> ChangeUriRpcMethod::process
(const RpcRequest& req, DownloadEngine* e)
{
const String* gidParam = checkRequiredParam<String>(req, 0);
- const Integer* indexParam = checkRequiredParam<Integer>(req, 1);
+ const Integer* indexParam = checkRequiredInteger(req, 1, IntegerGE(1));
const List* delUrisParam = checkRequiredParam<List>(req, 2);
const List* addUrisParam = checkRequiredParam<List>(req, 3);
const Integer* posParam = checkParam<Integer>(req, 4);
diff --git a/src/RpcMethodImpl.h b/src/RpcMethodImpl.h
index 1fe609af..56892047 100644
--- a/src/RpcMethodImpl.h
+++ b/src/RpcMethodImpl.h
@@ -76,6 +76,37 @@ const T* checkRequiredParam(const RpcRequest& req, size_t index)
return checkParam<T>(req, index, true);
}
+struct IntegerGE {
+ IntegerGE(int32_t min):min(min) {}
+
+ bool operator()(const Integer* param, std::string* error) const
+ {
+ if(min <= param->i()) {
+ return true;
+ } else {
+ if(error) {
+ *error = fmt("the value must be greater than or equal to %d.", min);
+ }
+ return false;
+ }
+ }
+
+ int32_t min;
+};
+
+template<typename Validator>
+const Integer* checkRequiredInteger(const RpcRequest& req, size_t index,
+ Validator validator)
+{
+ const Integer* param = checkRequiredParam<Integer>(req, index);
+ std::string error;
+ if(!validator(param, &error)) {
+ throw DL_ABORT_EX(fmt("The integer parameter at %lu has invalid value: %s",
+ static_cast<unsigned long>(index), error.c_str()));
+ }
+ return param;
+}
+
template<typename OutputIterator>
void toStringList(OutputIterator out, const List* src)
{
@@ -363,12 +394,9 @@ protected:
(const RpcRequest& req, DownloadEngine* e)
{
const Integer* offsetParam = checkRequiredParam<Integer>(req, 0);
- const Integer* numParam = checkRequiredParam<Integer>(req, 1);
+ const Integer* numParam = checkRequiredInteger(req, 1, IntegerGE(0));
const List* keysParam = checkParam<List>(req, 2);
- if(numParam->i() < 0) {
- throw DL_ABORT_EX("The parameter num must be zero or positive integer.");
- }
int64_t offset = offsetParam->i();
int64_t num = numParam->i();
std::vector<std::string> keys;
diff --git a/test/RpcMethodTest.cc b/test/RpcMethodTest.cc
index d28cc2fa..121357aa 100644
--- a/test/RpcMethodTest.cc
+++ b/test/RpcMethodTest.cc
@@ -999,6 +999,12 @@ void RpcMethodTest::testChangeUri_fail()
RpcResponse res = m.execute(req, e_.get());
CPPUNIT_ASSERT_EQUAL(0, res.code);
+ req.params->set(1, Integer::g(0));
+ res = m.execute(req, e_.get());
+ // RPC request fails because 2nd argument is less than 1.
+ CPPUNIT_ASSERT_EQUAL(1, res.code);
+
+ req.params->set(1, Integer::g(1));
req.params->set(0, String::g("2"));
res = m.execute(req, e_.get());
// RPC request fails because GID#2 does not exist.