]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw:fix some memory leak 9171/head
authorweiqiaomiao <wei.qiaomiao@zte.com.cn>
Wed, 18 May 2016 02:13:20 +0000 (10:13 +0800)
committerweiqiaomiao <wei.qiaomiao@zte.com.cn>
Wed, 18 May 2016 02:13:20 +0000 (10:13 +0800)
Signed-off-by: weiqiaomiao <wei.qiaomiao@zte.com.cn>
src/rgw/rgw_rest.h
src/rgw/rgw_rest_s3.cc

index bb288ca1ae63f8d979bbfea8fb5ee821c0b416d1..dd23927d2740f30abff74943f23d0366ea627c1a 100644 (file)
@@ -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;
index 2358955559eae9d9d1fd57208ef46555fdafa265..e4c295914fec4a3970835eb81f220e75a504d96f 100644 (file)
@@ -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<char, decltype(free)*>{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<char, decltype(free)*>{data, free};
+
   if (s->aws4_auth_needs_complete) {
       int ret_auth = do_aws4_auth_completion();
       if (ret_auth < 0) {