From f4fe5e2d524f8cca74f80a8a80fcd3e82b9effcb 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 --- 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 cbb0bb0762e3b..d24ad5c3451a1 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.39.5