]> git.ipfire.org Git - thirdparty/git.git/commitdiff
gpg-interface: do not use misdesigned strbuf_split*()
authorOlamide Caleb Bello <belkid98@gmail.com>
Thu, 23 Oct 2025 11:13:46 +0000 (11:13 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 23 Oct 2025 16:26:12 +0000 (09:26 -0700)
In get_ssh_finger_print(), the output of the `ssh-keygen` command is
put into `fingerprint_stdout` strbuf. The string in `fingerprint_stdout`
is then split into up to 3 strbufs using strbuf_split_max(). However they
are not modified after the split thereby not making use of the strbuf API
as the fingerprint token is merely returned as a char * and not a strbuf.
Hence they do not need to be strbufs.

Simplify the process of retrieving and returning the desired token by
using strchr() to isolate the token and xmemdupz() to return a copy of the
token. This removes the roundabout way of splitting the string into
strbufs just to return the token.

Reported-by: Junio Hamano <gitster@pobox.com>
Helped-by: Christian Couder <christian.couder@gmail.com>
Helped-by: Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>
Signed-off-by: Olamide Caleb Bello <belkid98@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
gpg-interface.c

index 06e7fb50603d22893e92c9c5f473e3c04d3396bf..68cb584732f8a0a7ffe101b86b6ed5895226534e 100644 (file)
@@ -821,8 +821,7 @@ static char *get_ssh_key_fingerprint(const char *signing_key)
        struct child_process ssh_keygen = CHILD_PROCESS_INIT;
        int ret = -1;
        struct strbuf fingerprint_stdout = STRBUF_INIT;
-       struct strbuf **fingerprint;
-       char *fingerprint_ret;
+       char *fingerprint_ret, *begin, *delim;
        const char *literal_key = NULL;
 
        /*
@@ -845,13 +844,17 @@ static char *get_ssh_key_fingerprint(const char *signing_key)
                die_errno(_("failed to get the ssh fingerprint for key '%s'"),
                          signing_key);
 
-       fingerprint = strbuf_split_max(&fingerprint_stdout, ' ', 3);
-       if (!fingerprint[1])
-               die_errno(_("failed to get the ssh fingerprint for key '%s'"),
+       begin = fingerprint_stdout.buf;
+       delim = strchr(begin, ' ');
+       if (!delim)
+               die(_("failed to get the ssh fingerprint for key %s"),
                          signing_key);
-
-       fingerprint_ret = strbuf_detach(fingerprint[1], NULL);
-       strbuf_list_free(fingerprint);
+       begin = delim + 1;
+       delim = strchr(begin, ' ');
+       if (!delim)
+           die(_("failed to get the ssh fingerprint for key %s"),
+                         signing_key);
+       fingerprint_ret = xmemdupz(begin, delim - begin);
        strbuf_release(&fingerprint_stdout);
        return fingerprint_ret;
 }