From 1845e41292696da9e20ecd87b9260b44ee312aed Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 30 May 2017 22:19:33 +0200 Subject: [PATCH] rgw: Swift API returns 400 Bad Request on too long container names. Fixes: http://tracker.ceph.com/issues/17935 Signed-off-by: Radoslaw Zarzynski --- src/rgw/rgw_common.cc | 1 + src/rgw/rgw_rest_swift.cc | 22 +++++++++++++++++----- src/rgw/rgw_rest_swift.h | 2 +- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index a644c62b67555..09fcdbfe83f2f 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -118,6 +118,7 @@ rgw_http_errors rgw_http_s3_errors({ rgw_http_errors rgw_http_swift_errors({ { EACCES, {403, "AccessDenied" }}, { EPERM, {401, "AccessDenied" }}, + { ENAMETOOLONG, {400, "Metadata name too long" }}, { ERR_USER_SUSPENDED, {401, "UserSuspended" }}, { ERR_INVALID_UTF8, {412, "Invalid UTF8" }}, { ERR_BAD_URL, {412, "Bad URL" }}, diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index 96f7cb7e50532..7f41926a1b8be 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -2,6 +2,7 @@ // vim: ts=8 sw=2 smarttab #include +#include #include #include @@ -2591,11 +2592,22 @@ int RGWHandler_REST_SWIFT::postauth_init() int RGWHandler_REST_SWIFT::validate_bucket_name(const string& bucket) { - int ret = RGWHandler_REST::validate_bucket_name(bucket); - if (ret < 0) - return ret; + const size_t len = bucket.size(); + + if (len > MAX_BUCKET_NAME_LEN) { + /* Bucket Name too long. Generate custom error message and bind it + * to an R-value reference. */ + const auto msg = boost::str( + boost::format("Container name length of %lld longer than %lld") + % len % int(MAX_BUCKET_NAME_LEN)); + set_req_state_err(s, ERR_INVALID_BUCKET_NAME, msg); + return -ERR_INVALID_BUCKET_NAME; + } - int len = bucket.size(); + const auto ret = RGWHandler_REST::validate_bucket_name(bucket); + if (ret < 0) { + return ret; + } if (len == 0) return 0; @@ -2608,7 +2620,7 @@ int RGWHandler_REST_SWIFT::validate_bucket_name(const string& bucket) const char *s = bucket.c_str(); - for (int i = 0; i < len; ++i, ++s) { + for (size_t i = 0; i < len; ++i, ++s) { if (*(unsigned char *)s == 0xff) return -ERR_INVALID_BUCKET_NAME; } diff --git a/src/rgw/rgw_rest_swift.h b/src/rgw/rgw_rest_swift.h index 296b83acde49b..6b14af9df82aa 100644 --- a/src/rgw/rgw_rest_swift.h +++ b/src/rgw/rgw_rest_swift.h @@ -381,7 +381,7 @@ class RGWHandler_REST_SWIFT : public RGWHandler_REST { } ~RGWHandler_REST_SWIFT() override = default; - static int validate_bucket_name(const string& bucket); + int validate_bucket_name(const string& bucket); int init(RGWRados *store, struct req_state *s, rgw::io::BasicClient *cio) override; int authorize() override;