diff options
author | Yehuda Sadeh <yehuda@hq.newdream.net> | 2011-09-02 13:26:21 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@hq.newdream.net> | 2011-09-02 13:26:21 -0700 |
commit | b30e1577b542c7038efad59dd468fad26f17efa4 (patch) | |
tree | e1ab89051bcb3a4f7975ff362901b2c6ef660136 | |
parent | 327d0ddfff12f1e2530e5568eeff0824aa3287ad (diff) | |
download | ceph-b30e1577b542c7038efad59dd468fad26f17efa4.tar.gz |
rgw: catch buffer::error exceptions thrown at decode
-rw-r--r-- | src/rgw/rgw_admin.cc | 14 | ||||
-rw-r--r-- | src/rgw/rgw_bucket.cc | 7 | ||||
-rw-r--r-- | src/rgw/rgw_cache.h | 5 | ||||
-rw-r--r-- | src/rgw/rgw_common.h | 1 | ||||
-rw-r--r-- | src/rgw/rgw_op.cc | 20 | ||||
-rw-r--r-- | src/rgw/rgw_os_auth.cc | 2 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 38 | ||||
-rw-r--r-- | src/rgw/rgw_rest.cc | 1 | ||||
-rw-r--r-- | src/rgw/rgw_user.cc | 44 |
9 files changed, 103 insertions, 29 deletions
diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index e2933845bde..170f2dbe38e 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -465,7 +465,12 @@ int process_intent_log(rgw_bucket& bucket, string& oid, time_t epoch, int flags, try { while (!iter.end()) { struct rgw_intent_log_entry entry; - ::decode(entry, iter); + try { + ::decode(entry, iter); + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: " << __func__ << "(): caught buffer::error" << dendl; + return -EIO; + } if (entry.op_time.sec() > epoch) { cerr << "skipping entry for obj=" << obj << " entry.op_time=" << entry.op_time.sec() << " requested epoch=" << epoch << std::endl; cerr << "skipping intent log" << std::endl; // no use to continue @@ -905,7 +910,12 @@ int main(int argc, char **argv) RGWAccessControlPolicy policy; if (ret >= 0) { bufferlist::iterator iter = bl.begin(); - policy.decode(iter); + try { + policy.decode(iter); + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: caught buffer::error, could not decode policy" << dendl; + return -EIO; + } policy.to_xml(cout); cout << std::endl; } diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 8069dbd9027..94eebd8f045 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -47,7 +47,12 @@ int rgw_get_bucket_info(string& bucket_name, RGWBucketInfo& info) } bufferlist::iterator iter = bl.begin(); - ::decode(info, iter); + try { + ::decode(info, iter); + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: could not decode buffer info, caught buffer::error" << dendl; + return -EIO; + } RGW_LOG(0) << "rgw_get_bucket_info: bucket=" << info.bucket << dendl; diff --git a/src/rgw/rgw_cache.h b/src/rgw/rgw_cache.h index d5c8c11ed13..8a2ab0dbaa4 100644 --- a/src/rgw/rgw_cache.h +++ b/src/rgw/rgw_cache.h @@ -320,9 +320,12 @@ int RGWCache<T>::watch_cb(int opcode, uint64_t ver, bufferlist& bl) try { bufferlist::iterator iter = bl.begin(); ::decode(info, iter); - } catch (buffer::end_of_buffer *err) { + } catch (buffer::end_of_buffer& err) { RGW_LOG(0) << "ERROR: got bad notification" << dendl; return -EIO; + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: buffer::error" << dendl; + return -EIO; } string name = normal_name(info.obj); diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 6f4b77e2094..038fa927601 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -112,6 +112,7 @@ extern string rgw_obj_category_none; #define ERR_LENGTH_REQUIRED 2011 #define ERR_REQUEST_TIME_SKEWED 2012 #define ERR_USER_SUSPENDED 2100 +#define ERR_INTERNAL_ERROR 2200 typedef void *RGWAccessHandle; diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 2de13f89fd8..86457ff9633 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -148,7 +148,12 @@ static int get_policy_from_attr(void *ctx, RGWAccessControlPolicy *policy, rgw_o if (ret >= 0) { bufferlist::iterator iter = bl.begin(); - policy->decode(iter); + try { + policy->decode(iter); + } catch (buffer::error& err) { + RGW_LOG(0) << "error: could not decode policy, caught buffer::error" << dendl; + return -EIO; + } if (g_conf->rgw_log >= 15) { RGW_LOG(15) << "Read AccessControlPolicy" << dendl; policy->to_xml(cerr); @@ -1212,7 +1217,12 @@ static int get_multiparts_info(struct req_state *s, string& meta_oid, map<uint32 if (name.compare(RGW_ATTR_ACL) == 0) { bufferlist& bl = iter->second; bufferlist::iterator bli = bl.begin(); - ::decode(policy, bli); + try { + ::decode(policy, bli); + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: could not decode policy, caught buffer::error" << dendl; + return -EIO; + } break; } } @@ -1222,7 +1232,11 @@ static int get_multiparts_info(struct req_state *s, string& meta_oid, map<uint32 bufferlist& bl = iter->second; bufferlist::iterator bli = bl.begin(); RGWUploadPartInfo info; - ::decode(info, bli); + try { + ::decode(info, bli); + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: could not decode policy, caught buffer::error" << dendl; + } parts[info.num] = info; } return 0; diff --git a/src/rgw/rgw_os_auth.cc b/src/rgw/rgw_os_auth.cc index a382ea6f102..c5556aa6dcc 100644 --- a/src/rgw/rgw_os_auth.cc +++ b/src/rgw/rgw_os_auth.cc @@ -83,7 +83,7 @@ int rgw_os_verify_signed_token(const char *token, RGWUserInfo& info) ::decode(os_user, iter); ::decode(nonce, iter); ::decode(expiration, iter); - } catch (buffer::error *err) { + } catch (buffer::error& err) { RGW_LOG(0) << "failed to decode token: caught exception" << dendl; return -EINVAL; } diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index ddc59b7e172..b39abf499bd 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -280,7 +280,12 @@ int RGWRados::list_objects(string& id, rgw_bucket& bucket, int max, string& pref bufferlist& bl = iter->second; bufferlist::iterator i = bl.begin(); RGWAccessControlPolicy policy; - policy.decode_owner(i); + try { + policy.decode_owner(i); + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: could not decode policy for oid=" << oid << ", caught buffer::error" << dendl; + continue; + } ACLOwner& owner = policy.get_owner(); obj.owner = owner.get_id(); obj.owner_display_name = owner.get_display_name(); @@ -793,16 +798,26 @@ int RGWRados::get_obj_state(RGWRadosCtx *rctx, rgw_obj& obj, librados::IoCtx& io s->exists = true; bufferlist::iterator oiter = outbl.begin(); - ::decode(s->attrset, oiter); + try { + ::decode(s->attrset, oiter); + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: failed decoding s->attrset (obj=" << obj << "), aborting" << dendl; + return -EIO; + } map<string, bufferlist>::iterator aiter; for (aiter = s->attrset.begin(); aiter != s->attrset.end(); ++aiter) { RGW_LOG(0) << "iter->first=" << aiter->first << dendl; } - ::decode(s->size, oiter); - utime_t ut; - ::decode(ut, oiter); - s->mtime = ut.sec(); + + try { + ::decode(s->size, oiter); + utime_t ut; + ::decode(ut, oiter); + s->mtime = ut.sec(); + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: failed decoding object (obj=" << obj << ") info (either size or mtime), aborting" << dendl; + } s->has_attrs = true; map<string, bufferlist>::iterator iter = s->attrset.find(RGW_ATTR_SHADOW_OBJ); @@ -1489,9 +1504,14 @@ int RGWRados::tmap_get(rgw_obj& obj, bufferlist& header, std::map<string, buffer if (r < 0) return r; - bufferlist::iterator iter = bl.begin(); - ::decode(header, iter); - ::decode(m, iter); + try { + bufferlist::iterator iter = bl.begin(); + ::decode(header, iter); + ::decode(m, iter); + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: tmap_get failed, caught buffer::error" << dendl; + return -EIO; + } return 0; diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 13be0dcaa83..b177a568636 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -52,6 +52,7 @@ const static struct rgw_html_errors RGW_HTML_ERRORS[] = { { EEXIST, 409, "BucketAlreadyExists" }, { ENOTEMPTY, 409, "BucketNotEmpty" }, { ERANGE, 416, "InvalidRange" }, + { ERR_INTERNAL_ERROR, 500, "InternalError" }, }; void set_req_state_err(struct req_state *s, int err_no) diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index be6b1f15b16..14336aca59c 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -115,9 +115,14 @@ int rgw_get_user_info_from_index(string& key, rgw_bucket& bucket, RGWUserInfo& i return ret; bufferlist::iterator iter = bl.begin(); - ::decode(uid, iter); - if (!iter.end()) - info.decode(iter); + try { + ::decode(uid, iter); + if (!iter.end()) + info.decode(iter); + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: failed to decode user info, caught buffer::error" << dendl; + return -EIO; + } return 0; } @@ -173,7 +178,12 @@ static int rgw_read_buckets_from_attr(string& user_id, RGWUserBuckets& buckets) return ret; bufferlist::iterator iter = bl.begin(); - buckets.decode(iter); + try { + buckets.decode(iter); + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: failed to decode buckets info, caught buffer::error" << dendl; + return -EIO; + } return 0; } @@ -230,13 +240,18 @@ int rgw_read_user_buckets(string user_id, RGWUserBuckets& buckets, bool need_sta bufferlist::iterator p = bl.begin(); bufferlist header; map<string,bufferlist> m; - ::decode(header, p); - ::decode(m, p); - for (map<string,bufferlist>::iterator q = m.begin(); q != m.end(); q++) { - bufferlist::iterator iter = q->second.begin(); - RGWBucketEnt bucket; - ::decode(bucket, iter); - buckets.add(bucket); + try { + ::decode(header, p); + ::decode(m, p); + for (map<string,bufferlist>::iterator q = m.begin(); q != m.end(); q++) { + bufferlist::iterator iter = q->second.begin(); + RGWBucketEnt bucket; + ::decode(bucket, iter); + buckets.add(bucket); + } + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: failed to decode bucket information, caught buffer::error" << dendl; + return -EIO; } } else { ret = rgw_read_buckets_from_attr(user_id, buckets); @@ -500,7 +515,12 @@ int rgw_retrieve_pool_info(int64_t pool_id, RGWPoolInfo& pool_info) return ret; } bufferlist::iterator iter = bl.begin(); - ::decode(pool_info, iter); + try { + ::decode(pool_info, iter); + } catch (buffer::error& err) { + RGW_LOG(0) << "ERROR: failed to decode pool information, caught buffer::error" << dendl; + return -EIO; + } return 0; } |