]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/credential-cache: fix trivial leaks
authorPatrick Steinhardt <ps@pks.im>
Thu, 1 Aug 2024 10:40:51 +0000 (12:40 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 1 Aug 2024 15:47:37 +0000 (08:47 -0700)
There are two trivial leaks in git-credential-cache(1):

  - We leak the child process in `spawn_daemon()`. As we do not call
    `finish_command()` and instead let the created process daemonize, we
    have to clear the process manually.

  - We do not free the computed socket path in case it wasn't given via
    `--socket=`.

Plug both of these memory leaks.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/credential-cache.c
t/t0301-credential-cache.sh

index 3db8df70a9b263c39bf4f8a295d4fad6fc59531c..aaf2f8438b45bf3ec503f71d5d86a41f50a1d07f 100644 (file)
@@ -88,6 +88,8 @@ static void spawn_daemon(const char *socket)
                die_errno("unable to read result code from cache daemon");
        if (r != 3 || memcmp(buf, "ok\n", 3))
                die("cache daemon did not start: %.*s", r, buf);
+
+       child_process_clear(&daemon);
        close(daemon.out);
 }
 
@@ -137,7 +139,8 @@ static void announce_capabilities(void)
 
 int cmd_credential_cache(int argc, const char **argv, const char *prefix)
 {
-       char *socket_path = NULL;
+       const char *socket_path_arg = NULL;
+       char *socket_path;
        int timeout = 900;
        const char *op;
        const char * const usage[] = {
@@ -147,7 +150,7 @@ int cmd_credential_cache(int argc, const char **argv, const char *prefix)
        struct option options[] = {
                OPT_INTEGER(0, "timeout", &timeout,
                            "number of seconds to cache credentials"),
-               OPT_STRING(0, "socket", &socket_path, "path",
+               OPT_STRING(0, "socket", &socket_path_arg, "path",
                           "path of cache-daemon socket"),
                OPT_END()
        };
@@ -160,6 +163,7 @@ int cmd_credential_cache(int argc, const char **argv, const char *prefix)
        if (!have_unix_sockets())
                die(_("credential-cache unavailable; no unix socket support"));
 
+       socket_path = xstrdup_or_null(socket_path_arg);
        if (!socket_path)
                socket_path = get_socket_path();
        if (!socket_path)
@@ -176,6 +180,7 @@ int cmd_credential_cache(int argc, const char **argv, const char *prefix)
        else
                ; /* ignore unknown operation */
 
+       free(socket_path);
        return 0;
 }
 
index c10e35905e0ea01b832ecd699b9079f683be674e..5d5b64205ffe35dfd74750b3188946200aab916e 100755 (executable)
@@ -1,6 +1,8 @@
 #!/bin/sh
 
 test_description='credential-cache tests'
+
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-credential.sh