From 7ad9933fbf3ab063ffe58467e0d970ab81be0cba Mon Sep 17 00:00:00 2001 From: Jeff Layton Date: Wed, 23 Aug 2017 12:13:14 -0400 Subject: [PATCH] fuse: use c++ allocations for group list Valgrind is unhappy about our turning on supplimentary group handling with fuse by default. The problem is that we end up calling delete to free the supplimentary gids list, but fuse uses malloc to allocate it. Note that I was initially concerned that I needed to use malloc and free there to handle the case of userland calling ceph_userperm_new, but we leave freeing the pointer up to the caller in that case. Convert fuse to use new/delete to allocate and free the group lists instead. Tracker: http://tracker.ceph.com/issues/21065 Signed-off-by: Jeff Layton (cherry picked from commit f4fe5e2d524f8cca74f80a8a80fcd3e82b9effcb) --- src/client/fuse_ll.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index 1fdd3289a93..d10f7b8143a 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -112,14 +112,15 @@ static int getgroups(fuse_req_t req, gid_t **sgids) return 0; } - *sgids = (gid_t*)malloc(c*sizeof(**sgids)); - if (!*sgids) { + gid_t *gids = new (std::nothrow) gid_t[c]; + if (!gids) { return -ENOMEM; } - c = fuse_req_getgroups(req, c, *sgids); + c = fuse_req_getgroups(req, c, gids); if (c < 0) { - free(*sgids); - return c; + delete gids; + } else { + *sgids = gids; } return c; #endif -- 2.47.3