]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados.cc: rados_getxattrs_next: don't try to use malloc(0)
authorDan Mick <dan.mick@redhat.com>
Tue, 1 Dec 2015 22:35:35 +0000 (14:35 -0800)
committerDan Mick <dan.mick@redhat.com>
Tue, 1 Dec 2015 22:35:35 +0000 (14:35 -0800)
If an xattr is 0 length, don't try to malloc a buffer for the value;
leave it NULL.  (Linux doesn't promise malloc(0) returns a pointer,
and other implementations, like AIX, definitely return NULL.)

Usage changes are in following commits.

Fixes: #13944
Signed-off-by: Dan Mick <dan.mick@redhat.com>
src/librados/librados.cc

index 403b5b03a0a0d35b46e446a17247274bdcf53ba8..ab3486dadbbd2f05d29289cea3d7384edea6849d 100644 (file)
@@ -3446,13 +3446,18 @@ extern "C" int rados_getxattrs_next(rados_xattrs_iter_t iter,
   *name = s.c_str();
   bufferlist &bl(it->i->second);
   size_t bl_len = bl.length();
-  it->val = (char*)malloc(bl_len);
-  if (!it->val) {
-    tracepoint(librados, rados_getxattrs_next_exit, -ENOMEM, *name, NULL, 0);
-    return -ENOMEM;
+  if (!bl_len) {
+    // malloc(0) is not guaranteed to return a valid pointer
+    *val = (char *)NULL;
+  } else {
+    it->val = (char*)malloc(bl_len);
+    if (!it->val) {
+      tracepoint(librados, rados_getxattrs_next_exit, -ENOMEM, *name, NULL, 0);
+      return -ENOMEM;
+    }
+    memcpy(it->val, bl.c_str(), bl_len);
+    *val = it->val;
   }
-  memcpy(it->val, bl.c_str(), bl_len);
-  *val = it->val;
   *len = bl_len;
   ++it->i;
   tracepoint(librados, rados_getxattrs_next_exit, 0, *name, *val, *len);