summaryrefslogtreecommitdiff
path: root/src/objclass
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@hq.newdream.net>2012-01-12 16:39:30 -0800
committerYehuda Sadeh <yehuda@hq.newdream.net>2012-01-12 16:39:30 -0800
commit8ceb388396d02daefe53e3bdb68c08b4855ceaf7 (patch)
tree68f052df63a40a9b231a7a4e8c21fc25377f6f00 /src/objclass
parent05d8ecbe1cea8d7c7bd33f9b53f4cbf06b2c4e61 (diff)
downloadceph-8ceb388396d02daefe53e3bdb68c08b4855ceaf7.tar.gz
rgw: wrap cls_cxx_map_* with try/catch around decoding
Diffstat (limited to 'src/objclass')
-rw-r--r--src/objclass/class_api.cc36
1 files changed, 22 insertions, 14 deletions
diff --git a/src/objclass/class_api.cc b/src/objclass/class_api.cc
index 11d3e0c966d..3645b23a8dc 100644
--- a/src/objclass/class_api.cc
+++ b/src/objclass/class_api.cc
@@ -274,9 +274,13 @@ int cls_cxx_map_read_header(cls_method_context_t hctx, bufferlist *outbl)
if (ret < 0)
return ret;
- //decode and return the header
- bufferlist::iterator map_iter = full_map.begin();
- ::decode(*outbl, map_iter);
+ try {
+ //decode and return the header
+ bufferlist::iterator map_iter = full_map.begin();
+ ::decode(*outbl, map_iter);
+ } catch (buffer::error& e) {
+ return -EINVAL;
+ }
return 0;
}
int cls_cxx_map_read_key(cls_method_context_t hctx, string key, bufferlist *outbl)
@@ -296,18 +300,22 @@ int cls_cxx_map_read_key(cls_method_context_t hctx, string key, bufferlist *outb
bufferlist next_val;
__u32 nkeys;
bufferlist::iterator map_iter = full_map.begin();
- ::decode(header, map_iter);
- ::decode(nkeys, map_iter);
- while (nkeys) {
- ::decode(next_key, map_iter);
- ::decode(next_val, map_iter);
- if (next_key == key) {
- *outbl = next_val;
- return 0;
+ try {
+ ::decode(header, map_iter);
+ ::decode(nkeys, map_iter);
+ while (nkeys) {
+ ::decode(next_key, map_iter);
+ ::decode(next_val, map_iter);
+ if (next_key == key) {
+ *outbl = next_val;
+ return 0;
+ }
+ if (next_key > key)
+ return -ENOENT;
+ --nkeys;
}
- if (next_key > key)
- return -ENOENT;
- --nkeys;
+ } catch (buffer::error& e) {
+ return -EINVAL;
}
return -ENOENT;
}