gpg-interface: do not use misdesigned strbuf_split*()

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>

Olamide Caleb Bello committed Oct 23, 2025 at 11:13 UTC bee1bdd5888aafd1a8d51df000170f18b6a299ac
1 file changed +11 -8
gpg-interface.c
+11 -8
@@ -821,8 +821,7 @@ static char *get_ssh_key_fingerprint(const char *signing_key)
821 struct child_process ssh_keygen = CHILD_PROCESS_INIT;
822 int ret = -1;
823 struct strbuf fingerprint_stdout = STRBUF_INIT;
824 - struct strbuf **fingerprint;
825 - char *fingerprint_ret;
824 + char *fingerprint_ret, *begin, *delim;
825 const char *literal_key = NULL;
826
827 /*
@@ -845,13 +844,17 @@ static char *get_ssh_key_fingerprint(const char *signing_key)
844 die_errno(_("failed to get the ssh fingerprint for key '%s'"),
845 signing_key);
846
848 - fingerprint = strbuf_split_max(&fingerprint_stdout, ' ', 3);
849 - if (!fingerprint[1])
850 - die_errno(_("failed to get the ssh fingerprint for key '%s'"),
847 + begin = fingerprint_stdout.buf;
848 + delim = strchr(begin, ' ');
849 + if (!delim)
850 + die(_("failed to get the ssh fingerprint for key %s"),
851 signing_key);
852 -
853 - fingerprint_ret = strbuf_detach(fingerprint[1], NULL);
854 - strbuf_list_free(fingerprint);
852 + begin = delim + 1;
853 + delim = strchr(begin, ' ');
854 + if (!delim)
855 + die(_("failed to get the ssh fingerprint for key %s"),
856 + signing_key);
857 + fingerprint_ret = xmemdupz(begin, delim - begin);
858 strbuf_release(&fingerprint_stdout);
859 return fingerprint_ret;
860 }