Skip to content

Commit

Permalink
rgw: fix issues with 'enforce bounds' patch
Browse files Browse the repository at this point in the history
The patch to enforce bounds on max-keys/max-uploads/max-parts had a few
issues that would prevent us from compiling it. Instead of changing the
code provided by the submitter, we're addressing them in a separate
commit to maintain the DCO.

Signed-off-by: Joao Eduardo Luis <joao@suse.de>
Signed-off-by: Abhishek Lekshmanan <abhishek@suse.com>
(cherry picked from commit 29bc434)
mimic specific fixes:
As the largeish change from master g_conf() isn't in mimic yet, use the g_conf
global structure, also make rgw_op use the value from req_info ceph context as
we do for all the requests
  • Loading branch information
jecluis authored and theanalyst committed Jan 4, 2019
1 parent 6be81e3 commit ab29bed
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 11 deletions.
2 changes: 1 addition & 1 deletion src/common/options.cc
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -6238,7 +6238,7 @@ std::vector<Option> get_rgw_options() {
.set_default(1000) .set_default(1000)
.set_min_max(1, 100000) .set_min_max(1, 100000)
.add_service("rgw") .add_service("rgw")
.set_description("Upper bound on results in listing operations, ListBucket max-keys"), .set_description("Upper bound on results in listing operations, ListBucket max-keys")
.set_long_description("This caps the maximum permitted value for listing-like operations in RGW S3. " .set_long_description("This caps the maximum permitted value for listing-like operations in RGW S3. "
"Affects ListBucket(max-keys), " "Affects ListBucket(max-keys), "
"ListBucketVersions(max-keys), " "ListBucketVersions(max-keys), "
Expand Down
4 changes: 3 additions & 1 deletion src/rgw/rgw_op.cc
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -2383,7 +2383,9 @@ int RGWListBucket::parse_max_keys()
// Bound min value of max-keys to '0' // Bound min value of max-keys to '0'
// Some S3 clients explicitly send max-keys=0 to detect if the bucket is // Some S3 clients explicitly send max-keys=0 to detect if the bucket is
// empty without listing any items. // empty without listing any items.
op_ret = parse_value_and_bound(max_keys, &max, 0, g_conf()->rgw_max_listing_results, default_max); return parse_value_and_bound(max_keys, max, 0,
s->cct->_conf->get_val<uint64_t>("rgw_max_listing_results"),
default_max);
} }


void RGWListBucket::pre_exec() void RGWListBucket::pre_exec()
Expand Down
19 changes: 12 additions & 7 deletions src/rgw/rgw_op.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -2235,11 +2235,16 @@ class RGWGetClusterStat : public RGWOp {
virtual const string name() { return "get_cluster_stat"; } virtual const string name() { return "get_cluster_stat"; }
}; };


static inline int parse_value_and_bound(const string &input, long *output, const long lower_bound, const long upper_bound, const long default_val) static inline int parse_value_and_bound(
const string &input,
int &output,
const long lower_bound,
const long upper_bound,
const long default_val)
{ {
if (!input.empty()) { if (!input.empty()) {
char *endptr; char *endptr;
*output = strtol(input.c_str(), &endptr, 10); output = strtol(input.c_str(), &endptr, 10);
if (endptr) { if (endptr) {
if (endptr == input.c_str()) return -EINVAL; if (endptr == input.c_str()) return -EINVAL;
while (*endptr && isspace(*endptr)) // ignore white space while (*endptr && isspace(*endptr)) // ignore white space
Expand All @@ -2248,14 +2253,14 @@ static inline int parse_value_and_bound(const string &input, long *output, const
return -EINVAL; return -EINVAL;
} }
} }
if(*output > upper_bound) { if(output > upper_bound) {
*output = upper_bound; output = upper_bound;
} }
if(*output < lower_bound) { if(output < lower_bound) {
*output = lower_bound; output = lower_bound;
} }
} else { } else {
*output = default_val; output = default_val;
} }


return 0; return 0;
Expand Down
8 changes: 6 additions & 2 deletions src/rgw/rgw_rest.cc
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -1588,7 +1588,9 @@ int RGWListMultipart_ObjStore::get_params()
} }


string str = s->info.args.get("max-parts"); string str = s->info.args.get("max-parts");
op_ret = parse_value_and_bound(str, &max_parts, 0, g_conf()->rgw_max_listing_results, max_parts); op_ret = parse_value_and_bound(str, max_parts, 0,
g_conf->get_val<uint64_t>("rgw_max_listing_results"),
max_parts);


return op_ret; return op_ret;
} }
Expand All @@ -1598,7 +1600,9 @@ int RGWListBucketMultiparts_ObjStore::get_params()
delimiter = s->info.args.get("delimiter"); delimiter = s->info.args.get("delimiter");
prefix = s->info.args.get("prefix"); prefix = s->info.args.get("prefix");
string str = s->info.args.get("max-uploads"); string str = s->info.args.get("max-uploads");
op_ret = parse_value_and_bound(str, &max_uploads, 0, g_conf()->rgw_max_listing_results, default_max); op_ret = parse_value_and_bound(str, max_uploads, 0,
g_conf->get_val<uint64_t>("rgw_max_listing_results"),
default_max);
if (op_ret < 0) { if (op_ret < 0) {
return op_ret; return op_ret;
} }
Expand Down

0 comments on commit ab29bed

Please sign in to comment.