summaryrefslogtreecommitdiff
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-rw-r--r--src/RpcMethodImpl.cc2
-rw-r--r--src/RpcMethodImpl.h36
2 files changed, 33 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;