]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: invalid free() in rados_getxattrs_next()
authorGu Zhongyan <guzhongyan@360.cn>
Fri, 2 Feb 2018 10:01:05 +0000 (18:01 +0800)
committerGu Zhongyan <guzhongyan@360.cn>
Mon, 5 Feb 2018 04:06:12 +0000 (12:06 +0800)
Invalid free() can cause corruption when getting an object
attribute with empty value.

Check the validity of the pointer before free(). Also move
the free() call at the start of rados_getxattrs_next() to
avoid memory leak.

Fixes: http://tracker.ceph.com/issues/22042
Signed-off-by: Gu Zhongyan <guzhongyan@360.cn>
src/librados/librados.cc

index a3143973e2a3301a3b879de6140f45bf39071577..b95b779a128955cf6723302c6d55d81c6c0a6b31 100644 (file)
@@ -4281,6 +4281,10 @@ extern "C" int rados_getxattrs_next(rados_xattrs_iter_t iter,
 {
   tracepoint(librados, rados_getxattrs_next_enter, iter);
   librados::RadosXattrsIter *it = static_cast<librados::RadosXattrsIter*>(iter);
+  if (it->val) {
+    free(it->val);
+    it->val = NULL;
+  }
   if (it->i == it->attrset.end()) {
     *name = NULL;
     *val = NULL;
@@ -4288,7 +4292,6 @@ extern "C" int rados_getxattrs_next(rados_xattrs_iter_t iter,
     tracepoint(librados, rados_getxattrs_next_exit, 0, NULL, NULL, 0);
     return 0;
   }
-  free(it->val);
   const std::string &s(it->i->first);
   *name = s.c_str();
   bufferlist &bl(it->i->second);