]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: ETag is unquoted in multipart upload complete
authorYehuda Sadeh <yehuda@inktank.com>
Wed, 1 Aug 2012 20:09:41 +0000 (13:09 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Fri, 10 Aug 2012 17:39:33 +0000 (10:39 -0700)
Fixes #2877.
Removing quotes from ETag before comparing it to what we
have when completing a multipart upload.

Backport: argonaut
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_op.cc

index dfd6caf55d3442f32b21217dc688ac7fdbd8e146..35b5f5d79f6958c61c59ca5402c1ec51b522ba28 100644 (file)
@@ -1476,6 +1476,23 @@ int RGWCompleteMultipart::verify_permission()
   return 0;
 }
 
+static string string_unquote(const string& s)
+{
+  if (s[0] != '"' || s.size() < 2)
+    return s;
+
+  int len;
+  for (len = s.size(); len > 2; --len) {
+    if (s[len - 1] != ' ')
+      break;
+  }
+
+  if (s[len-1] != '"')
+    return s;
+
+  return s.substr(1, len - 2);
+}
+
 void RGWCompleteMultipart::execute()
 {
   RGWMultiCompleteUpload *parts;
@@ -1541,7 +1558,8 @@ void RGWCompleteMultipart::execute()
       ret = -ERR_INVALID_PART;
       goto done;
     }
-    if (iter->second.compare(obj_iter->second.etag) != 0) {
+    string part_etag = string_unquote(iter->second);
+    if (part_etag.compare(obj_iter->second.etag) != 0) {
       ldout(s->cct, 0) << "NOTICE: etag mismatch: part: " << iter->first << " etag: " << iter->second << dendl;
       ret = -ERR_INVALID_PART;
       goto done;