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

In get_default_ssh_signing_key(), the default ssh signing key is retrieved in `key_stdout` buf, which is then split using strbuf_split_max() into up to two strbufs at a new line and the first strbuf is returned as a `char *`and not a strbuf. This makes the function lack the use of strbuf API as no edits are performed on the split tokens. Simplify the process of retrieving and returning the desired line by using strchr() to isolate the line and xmemdupz() to return a copy of the line. This removes the roundabout way of splitting the string into strbufs, just to return the line. 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 2ab72a16d9e3f1aca223f5da5aaf8b533d8fa35a
1 file changed +10 -5
gpg-interface.c
+10 -5
@@ -865,12 +865,12 @@ static char *get_default_ssh_signing_key(void)
865 struct child_process ssh_default_key = CHILD_PROCESS_INIT;
866 int ret = -1;
867 struct strbuf key_stdout = STRBUF_INIT, key_stderr = STRBUF_INIT;
868 - struct strbuf **keys;
868 char *key_command = NULL;
869 const char **argv;
870 int n;
871 char *default_key = NULL;
872 const char *literal_key = NULL;
873 + char *begin, *new_line, *first_line;
874
875 if (!ssh_default_key_command)
876 die(_("either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured"));
@@ -887,19 +887,24 @@ static char *get_default_ssh_signing_key(void)
887 &key_stderr, 0);
888
889 if (!ret) {
890 - keys = strbuf_split_max(&key_stdout, '\n', 2);
891 - if (keys[0] && is_literal_ssh_key(keys[0]->buf, &literal_key)) {
890 + begin = key_stdout.buf;
891 + new_line = strchr(begin, '\n');
892 + if (new_line)
893 + first_line = xmemdupz(begin, new_line - begin);
894 + else
895 + first_line = xstrdup(begin);
896 + if (is_literal_ssh_key(first_line, &literal_key)) {
897 /*
898 * We only use `is_literal_ssh_key` here to check validity
899 * The prefix will be stripped when the key is used.
900 */
896 - default_key = strbuf_detach(keys[0], NULL);
901 + default_key = first_line;
902 } else {
903 + free(first_line);
904 warning(_("gpg.ssh.defaultKeyCommand succeeded but returned no keys: %s %s"),
905 key_stderr.buf, key_stdout.buf);
906 }
907
902 - strbuf_list_free(keys);
908 } else {
909 warning(_("gpg.ssh.defaultKeyCommand failed: %s %s"),
910 key_stderr.buf, key_stdout.buf);