]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: some encoding fixes
authorYehuda Sadeh <yehuda@hq.newdream.net>
Mon, 15 Aug 2011 21:15:09 +0000 (14:15 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Mon, 15 Aug 2011 21:15:35 +0000 (14:15 -0700)
src/rgw/rgw_common.cc
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rest_s3.cc

index 1947ec315cdc309e807e303003e516833d792c6e..76abedcc3fc8d71c93258abdc8333fd94ef9c57e 100644 (file)
@@ -312,7 +312,11 @@ bool url_decode(string& src_str, string& dest_str)
       }
     } else {
       src++;
+      if (!*src)
+        break;
       char c1 = hex_to_num(*src++);
+      if (!*src)
+        break;
       c = c1 << 4;
       if (c1 < 0)
         return false;
index c0fd7214a51bf4fa1ed8acab4c850b3033bd8b78..6d99aead59c3b5a4c6ba607f46d5db28214fba4d 100644 (file)
@@ -161,7 +161,8 @@ static int get_policy_from_attr(void *ctx, RGWAccessControlPolicy *policy, rgw_o
 
 int read_acls(struct req_state *s, RGWAccessControlPolicy *policy, string& bucket, string& object)
 {
-  string upload_id = s->args.get("uploadId");
+  string upload_id;
+  url_decode(s->args.get("uploadId"), upload_id);
   string oid = object;
   rgw_obj obj;
 
@@ -376,10 +377,9 @@ void RGWListBucket::execute()
   string no_ns;
 
   url_decode(s->args.get("prefix"), prefix);
-  marker = s->args.get("marker");
-  max_keys = s->args.get(limit_opt_name);
+  url_decode(s->args.get("marker"), marker);
+  url_decode(s->args.get(limit_opt_name), max_keys);
   if (!max_keys.empty()) {
-    const char *srcptr = max_keys.c_str();
     char *endptr;
     max = strtol(max_keys.c_str(), &endptr, 10);
     if (endptr) {
@@ -396,7 +396,8 @@ void RGWListBucket::execute()
   url_decode(s->args.get("delimiter"), delimiter);
 
   if (s->prot_flags & RGW_REST_OPENSTACK) {
-    string path_args = s->args.get("path");
+    string path_args;
+    url_decode(s->args.get("path"), path_args);
     if (!path_args.empty()) {
       if (!delimiter.empty() || !prefix.empty()) {
         ret = -EINVAL;
@@ -607,11 +608,12 @@ void RGWPutObj::execute()
       oid.append(buf);
     } else {
       oid = s->object_str;
-      string upload_id = s->args.get("uploadId");
+      string upload_id;
+      url_decode(s->args.get("uploadId"), upload_id);
       RGWMPObj mp(oid, upload_id);
       multipart_meta_obj = mp.get_meta();
 
-      part_num = s->args.get("partNumber");
+      url_decode(s->args.get("partNumber"), part_num);
       if (part_num.empty()) {
         ret = -EINVAL;
         goto done;
@@ -1327,9 +1329,10 @@ int RGWAbortMultipart::verify_permission()
 void RGWAbortMultipart::execute()
 {
   ret = -EINVAL;
-  string upload_id = s->args.get("uploadId");
+  string upload_id;
   string meta_oid;
   string prefix;
+  url_decode(s->args.get("uploadId"), upload_id);
   map<uint32_t, RGWUploadPartInfo> obj_parts;
   map<uint32_t, RGWUploadPartInfo>::iterator obj_iter;
   RGWAccessControlPolicy policy;
@@ -1410,7 +1413,8 @@ void RGWListBucketMultiparts::execute()
     goto done;
 
   if (s->prot_flags & RGW_REST_OPENSTACK) {
-    string path_args = s->args.get("path");
+    string path_args;
+    url_decode(s->args.get("path"), path_args);
     if (!path_args.empty()) {
       if (!delimiter.empty() || !prefix.empty()) {
         ret = -EINVAL;
index 1d8f7fe6866c294bb64d0693f094440202fd91cf..c0fed5833b6ee1d1423b86cbba12ceb77ac9c929 100644 (file)
@@ -237,7 +237,7 @@ int RGWRados::list_objects(string& id, string& bucket, int max, string& prefix,
 
   result.clear();
   int i;
-  for (i=0; (!max || i<max) && p != dir_map.end(); i++, ++p) {
+  for (i=0; i<max && p != dir_map.end(); i++, ++p) {
     RGWObjEnt obj;
     string name = p->first;
     string key = p->second;
index cedeaa415a093c74cb908b8932864dd56dce9159..0e73b132bc73799bf3ad93a335a95e189d448f93 100644 (file)
@@ -129,13 +129,12 @@ void RGWListBucket_REST_S3::send_response()
   s->formatter->dump_format("Name", s->bucket);
   if (!prefix.empty())
     s->formatter->dump_format("Prefix", prefix.c_str());
-  if (!marker.empty())
-    s->formatter->dump_format("Marker", marker.c_str());
+  s->formatter->dump_format("Marker", marker.c_str());
   s->formatter->dump_int("MaxKeys", max);
   if (!delimiter.empty())
     s->formatter->dump_format("Delimiter", delimiter.c_str());
 
-  s->formatter->dump_format("IsTruncated", (is_truncated ? "true" : "false"));
+  s->formatter->dump_format("IsTruncated", (max && is_truncated ? "true" : "false"));
 
   if (ret >= 0) {
     vector<RGWObjEnt>::iterator iter;