summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@hq.newdream.net>2011-09-02 13:26:21 -0700
committerYehuda Sadeh <yehuda@hq.newdream.net>2011-09-02 13:26:21 -0700
commitb30e1577b542c7038efad59dd468fad26f17efa4 (patch)
treee1ab89051bcb3a4f7975ff362901b2c6ef660136
parent327d0ddfff12f1e2530e5568eeff0824aa3287ad (diff)
downloadceph-b30e1577b542c7038efad59dd468fad26f17efa4.tar.gz
rgw: catch buffer::error exceptions thrown at decode
-rw-r--r--src/rgw/rgw_admin.cc14
-rw-r--r--src/rgw/rgw_bucket.cc7
-rw-r--r--src/rgw/rgw_cache.h5
-rw-r--r--src/rgw/rgw_common.h1
-rw-r--r--src/rgw/rgw_op.cc20
-rw-r--r--src/rgw/rgw_os_auth.cc2
-rw-r--r--src/rgw/rgw_rados.cc38
-rw-r--r--src/rgw/rgw_rest.cc1
-rw-r--r--src/rgw/rgw_user.cc44
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;
}