]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix rgw crash when duration is invalid in sts request 32119/head
authoryuliyang <yuliyang@cmss.chinamobile.com>
Mon, 9 Dec 2019 12:23:15 +0000 (20:23 +0800)
committeryuliyang <yuliyang@cmss.chinamobile.com>
Tue, 10 Dec 2019 08:15:17 +0000 (16:15 +0800)
Fixes: https://tracker.ceph.com/issues/43018
Signed-off-by: yuliyang <yuliyang@cmss.chinamobile.com>
src/rgw/rgw_rest_sts.cc
src/rgw/rgw_sts.cc
src/rgw/rgw_sts.h

index 337c605e03d5c9b029c1b073f6ab17383bc0c3af..c92ce9894e9df4ebeea9b70658f5e2238ea406eb 100644 (file)
@@ -187,7 +187,12 @@ int RGWSTSGetSessionToken::get_params()
   tokenCode = s->info.args.get("TokenCode");
 
   if (! duration.empty()) {
-    uint64_t duration_in_secs = stoull(duration);
+    string err;
+    uint64_t duration_in_secs = strict_strtoll(duration.c_str(), 10, &err);
+    if (!err.empty()) {
+      return -EINVAL;
+    }
+
     if (duration_in_secs < STS::GetSessionTokenRequest::getMinDuration() ||
             duration_in_secs > s->cct->_conf->rgw_sts_max_session_duration)
       return -EINVAL;
index 196ba0002f45f20ba98584cf5f8ccfc33d51e4b6..de4e33fb4aa788956d5af909e97656a23b709b1a 100644 (file)
@@ -171,12 +171,16 @@ AssumeRoleRequestBase::AssumeRoleRequestBase( const string& duration,
   if (duration.empty()) {
     this->duration = DEFAULT_DURATION_IN_SECS;
   } else {
-    this->duration = std::stoull(duration);
+    this->duration = strict_strtoll(duration.c_str(), 10, &this->err_msg);
   }
 }
 
 int AssumeRoleRequestBase::validate_input() const
 {
+  if (!err_msg.empty()) {
+    return -EINVAL;
+  }
+
   if (duration < MIN_DURATION_IN_SECS ||
           duration > MAX_DURATION_IN_SECS) {
     return -EINVAL;
index 08f060fcf25c4db048061138b043f9e04d8bf7c6..86b621a30852e3ca81b29490fb62906c55ddf1c8 100644 (file)
@@ -22,6 +22,7 @@ protected:
   static constexpr uint64_t MAX_ROLE_SESSION_SIZE = 64;
   uint64_t MAX_DURATION_IN_SECS;
   uint64_t duration;
+  string err_msg;
   string iamPolicy;
   string roleArn;
   string roleSessionName;