From 2959caf6080095e7c791344dd04e2ad429b3e4b8 Mon Sep 17 00:00:00 2001 From: weiqiaomiao Date: Wed, 18 May 2016 10:13:20 +0800 Subject: [PATCH] rgw:fix some memory leak Signed-off-by: weiqiaomiao --- src/rgw/rgw_rest.h | 5 +++-- src/rgw/rgw_rest_s3.cc | 17 +++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) 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) { -- 2.47.3