From: weiqiaomiao Date: Wed, 18 May 2016 02:13:20 +0000 (+0800) Subject: rgw:fix some memory leak X-Git-Tag: v11.0.0~445^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2959caf6080095e7c791344dd04e2ad429b3e4b8;p=ceph.git rgw:fix some memory leak Signed-off-by: weiqiaomiao --- diff --git a/src/rgw/rgw_rest.h b/src/rgw/rgw_rest.h index bb288ca1ae63..dd23927d2740 100644 --- a/src/rgw/rgw_rest.h +++ b/src/rgw/rgw_rest.h @@ -98,9 +98,10 @@ int rgw_rest_get_json_input_keep_data(CephContext *cct, req_state *s, T& out, in } try { - decode_json_obj(out, &parser); + decode_json_obj(out, &parser); } catch (JSONDecoder::err& e) { - return -EINVAL; + free(data); + return -EINVAL; } *pdata = data; diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 2358955559ea..e4c295914fec 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -710,13 +710,15 @@ int RGWSetBucketVersioning_ObjStore_S3::get_params() { #define GET_BUCKET_VERSIONING_BUF_MAX (128 * 1024) - char *data; + char *data = nullptr; int len = 0; int r = rgw_rest_read_all_input(s, &data, &len, GET_BUCKET_VERSIONING_BUF_MAX); if (r < 0) { return r; } + + auto data_deleter = std::unique_ptr{data, free}; if (s->aws4_auth_needs_complete) { int ret_auth = do_aws4_auth_completion(); @@ -730,20 +732,17 @@ int RGWSetBucketVersioning_ObjStore_S3::get_params() if (!parser.init()) { ldout(s->cct, 0) << "ERROR: failed to initialize parser" << dendl; r = -EIO; - goto done; + return r; } if (!parser.parse(data, len, 1)) { ldout(s->cct, 10) << "failed to parse data: " << data << dendl; r = -EINVAL; - goto done; + return r; } r = parser.get_versioning_status(&enable_versioning); - -done: - free(data); - + return r; } @@ -759,13 +758,15 @@ int RGWSetBucketWebsite_ObjStore_S3::get_params() { static constexpr uint32_t GET_BUCKET_WEBSITE_BUF_MAX = (128 * 1024); - char *data; + char *data = nullptr; int len = 0; int r = rgw_rest_read_all_input(s, &data, &len, GET_BUCKET_WEBSITE_BUF_MAX); if (r < 0) { return r; } + auto data_deleter = std::unique_ptr{data, free}; + if (s->aws4_auth_needs_complete) { int ret_auth = do_aws4_auth_completion(); if (ret_auth < 0) {