]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: modules: gluster. Fix the error I made in preventing talloc leaks from a function.
authorJeremy Allison <jra@samba.org>
Tue, 10 Nov 2020 18:18:18 +0000 (10:18 -0800)
committerKarolin Seeger <kseeger@samba.org>
Thu, 19 Nov 2020 12:38:34 +0000 (12:38 +0000)
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 <jra@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
Autobuild-User(master): Günther Deschner <gd@samba.org>
Autobuild-Date(master): Wed Nov 11 15:02:27 UTC 2020 on sn-devel-184

(cherry picked from commit 457b49c67803dd95abc8502c2a410fac273f6fba)

Autobuild-User(v4-11-test): Karolin Seeger <kseeger@samba.org>
Autobuild-Date(v4-11-test): Thu Nov 19 12:38:34 UTC 2020 on sn-devel-184

source3/modules/vfs_glusterfs.c

index 747176ecebbeab26856a1a31e69477f0b5e5a968..190235cf8ae5ebba17d2fb46653c6b64a740ca9a 100644 (file)
@@ -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;
 }