From 457b49c67803dd95abc8502c2a410fac273f6fba Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 10 Nov 2020 10:18:18 -0800 Subject: [PATCH] s3: modules: gluster. Fix the error I made in preventing talloc leaks from a function. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit file_lines_parse() plays horrible tricks with the passed-in talloc pointers and the hierarcy which makes freeing hard to get right. As we know mem_ctx is freed by the caller, after calling file_lines_parse don't free on exit and let the caller handle it. This violates good Samba coding practice but we know we're not leaking here. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14486 Signed-off-by: Jeremy Allison Reviewed-by: Guenther Deschner Autobuild-User(master): Günther Deschner Autobuild-Date(master): Wed Nov 11 15:02:27 UTC 2020 on sn-devel-184 --- source3/modules/vfs_glusterfs.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c index 1ed6235e37f..c438a64d9be 100644 --- a/source3/modules/vfs_glusterfs.c +++ b/source3/modules/vfs_glusterfs.c @@ -315,15 +315,25 @@ static int check_for_write_behind_translator(TALLOC_CTX *mem_ctx, return -1; } + /* + * file_lines_parse() plays horrible tricks with + * the passed-in talloc pointers and the hierarcy + * which makes freeing hard to get right. + * + * As we know mem_ctx is freed by the caller, after + * this point don't free on exit and let the caller + * handle it. This violates good Samba coding practice + * but we know we're not leaking here. + */ + lines = file_lines_parse(buf, newlen, &numlines, mem_ctx); if (lines == NULL || numlines <= 0) { - TALLOC_FREE(option); - TALLOC_FREE(buf); return -1; } + /* On success, buf is now a talloc child of lines !! */ for (i=0; i < numlines; i++) { if (strequal(lines[i], option)) { @@ -338,15 +348,9 @@ static int check_for_write_behind_translator(TALLOC_CTX *mem_ctx, "Please check the vfs_glusterfs(8) manpage for " "further details.\n", volume); - TALLOC_FREE(lines); - TALLOC_FREE(option); - TALLOC_FREE(buf); return -1; } - TALLOC_FREE(lines); - TALLOC_FREE(option); - TALLOC_FREE(buf); return 0; }