From: Dunrong Huang Date: Mon, 28 Dec 2015 10:14:22 +0000 (+0800) Subject: rgw: do not abort when user passed bad parameters to set metadata X-Git-Tag: v0.94.8~31^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9786394b2f75d883505125bc45c95fb685b96531;p=ceph.git rgw: do not abort when user passed bad parameters to set metadata Fixes: #14190 when user passes bad parameter(e.g. pass "null" to bool parameter), the ceph_json.cc::decode_json_obj() will raise a exception with type of JSONDecoder::err(). If we do not catch this exception, the radosgw server will abort. $ curl -X PUT http://ceph1:9090/admin/metadata?user&format=json -d 'data = { "mtime": "null"}' terminate called after throwing an instance of 'JSONDecoder::err' *** Caught signal (Aborted) ** in thread 7ff982f55700 ceph version 10.0.1-787-gc485d29 (c485d29a53f6a2c1a3b561c54632dbac1c4e9473) 1: (ceph::BackTrace::BackTrace(int)+0x2d) [0x7ffa814db8c5] 2: (()+0x8fbfb7) [0x7ffa814dafb7] 3: (()+0xf100) [0x7ffa758a6100] 4: (gsignal()+0x37) [0x7ffa748e05f7] 5: (abort()+0x148) [0x7ffa748e1ce8] 6: (__gnu_cxx::__verbose_terminate_handler()+0x165) [0x7ffa751e49b5] 7: (()+0x5e926) [0x7ffa751e2926] 8: (()+0x5e953) [0x7ffa751e2953] 9: (()+0x5eb73) [0x7ffa751e2b73] 10: (bool JSONDecoder::decode_json(char const*, long&, JSONObj*, bool)+0x28c) [0x7ffa8135920a] 11: (RGWMetadataManager::put(std::string&, ceph::buffer::list&, RGWMetadataHandler::sync_type_t, obj_version*)+0x173) [0x7ffa81468029] 12: (RGWOp_Metadata_Put::execute()+0x172) [0x7ffa81308dcc] 13: (()+0x7532d2) [0x7ffa813322d2] 14: (RGWFCGXProcess::handle_request(RGWRequest*)+0x90) [0x7ffa813328a4] Reported-by: Coffee Chou Signed-off-by: Dunrong Huang (cherry picked from commit 83503239c81573232429a5fe98381f1a8f1357e9) Conflicts: src/rgw/rgw_user.cc hammer version uses RGWUserInfo instead of RGWUserCompleteInfo --- diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 5d2af38ea6f..4dc1dbad5c6 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -1552,7 +1552,11 @@ public: int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker, time_t mtime, JSONObj *obj, sync_type_t sync_type) { RGWBucketEntryPoint be, old_be; - decode_json_obj(be, obj); + try { + decode_json_obj(be, obj); + } catch (JSONDecoder::err& e) { + return -EINVAL; + } time_t orig_mtime; map attrs; @@ -1712,7 +1716,11 @@ public: int put(RGWRados *store, string& oid, RGWObjVersionTracker& objv_tracker, time_t mtime, JSONObj *obj, sync_type_t sync_type) { RGWBucketCompleteInfo bci, old_bci; - decode_json_obj(bci, obj); + try { + decode_json_obj(bci, obj); + } catch (JSONDecoder::err& e) { + return -EINVAL; + } time_t orig_mtime; RGWObjectCtx obj_ctx(store); diff --git a/src/rgw/rgw_metadata.cc b/src/rgw/rgw_metadata.cc index ece9ebf224e..e42290a80a9 100644 --- a/src/rgw/rgw_metadata.cc +++ b/src/rgw/rgw_metadata.cc @@ -355,9 +355,13 @@ int RGWMetadataManager::put(string& metadata_key, bufferlist& bl, time_t mtime = 0; - JSONDecoder::decode_json("key", metadata_key, &parser); - JSONDecoder::decode_json("ver", *objv, &parser); - JSONDecoder::decode_json("mtime", mtime, &parser); + try { + JSONDecoder::decode_json("key", metadata_key, &parser); + JSONDecoder::decode_json("ver", *objv, &parser); + JSONDecoder::decode_json("mtime", mtime, &parser); + } catch (JSONDecoder::err& e) { + return -EINVAL; + } JSONObj *jo = parser.find_obj("data"); if (!jo) { diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index 1e122df063b..125a7ab97fd 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -2428,7 +2428,11 @@ public: time_t mtime, JSONObj *obj, sync_type_t sync_mode) { RGWUserInfo info; - decode_json_obj(info, obj); + try { + decode_json_obj(info, obj); + } catch (JSONDecoder::err& e) { + return -EINVAL; + } RGWUserInfo old_info; time_t orig_mtime;