From 97c19da45eedb00db4d4cd684824c3adca1fe6bb Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 7 Nov 2012 15:39:56 -0800 Subject: [PATCH] rgw: unquote etag for if-match Fixes: #3453 Passed ETag for copy/get request may be quoted. Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_common.cc | 17 +++++++++++++++++ src/rgw/rgw_common.h | 1 + src/rgw/rgw_op.cc | 19 +------------------ src/rgw/rgw_rados.cc | 11 +++++++---- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index b0460929da808..e76554d2f3180 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -141,6 +141,23 @@ std::ostream& operator<<(std::ostream& oss, const rgw_err &err) return oss; } +string rgw_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); +} + static bool check_str_end(const char *s) { if (!s) diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index f4a02eedcf4e3..a1a2686ec7301 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -1018,6 +1018,7 @@ static inline const char *rgw_obj_category_name(RGWObjCategory category) return "unknown"; } +extern string rgw_string_unquote(const string& s); /** time parsing */ extern int parse_time(const char *time_str, time_t *time); extern bool parse_rfc2616(const char *s, struct tm *t); diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 70659cc3e666c..19c66c2937ced 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1714,23 +1714,6 @@ 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; @@ -1796,7 +1779,7 @@ void RGWCompleteMultipart::execute() ret = -ERR_INVALID_PART; return; } - string part_etag = string_unquote(iter->second); + string part_etag = rgw_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; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 583992def6ea0..538f206b12155 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -2252,19 +2252,22 @@ int RGWRados::prepare_get_obj(void *ctx, rgw_obj& obj, goto done_err; if (if_match) { - ldout(cct, 10) << "ETag: " << etag.c_str() << " " << " If-Match: " << if_match << dendl; - if (strcmp(if_match, etag.c_str())) { + string if_match_str = rgw_string_unquote(if_match); + ldout(cct, 10) << "ETag: " << etag.c_str() << " " << " If-Match: " << if_match_str << dendl; + if (if_match_str.compare(etag.c_str()) != 0) { r = -ERR_PRECONDITION_FAILED; goto done_err; } } if (if_nomatch) { - ldout(cct, 10) << "ETag: " << etag.c_str() << " " << " If-NoMatch: " << if_nomatch << dendl; - if (strcmp(if_nomatch, etag.c_str()) == 0) { + string if_nomatch_str = rgw_string_unquote(if_nomatch); + ldout(cct, 10) << "ETag: " << etag.c_str() << " " << " If-NoMatch: " << if_nomatch_str << dendl; + if (if_nomatch_str.compare(etag.c_str()) == 0) { r = -ERR_NOT_MODIFIED; goto done_err; } + if_nomatch = if_nomatch_str.c_str(); } } -- 2.39.5