Merge branch 'ob/gpg-interface-cleanup'

strbuf_split*() to split a string into multiple strbufs is often a
wrong API to use.  A few uses of it have been removed by
simplifying the code.

* ob/gpg-interface-cleanup:
  gpg-interface: do not use misdesigned strbuf_split*()
  gpg-interface: do not use misdesigned strbuf_split*()
main
Junio C Hamano 2025-10-30 08:00:19 -07:00
commit c43d4cf762
1 changed files with 21 additions and 13 deletions

View 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;
}
@ -862,12 +865,12 @@ static char *get_default_ssh_signing_key(void)
struct child_process ssh_default_key = CHILD_PROCESS_INIT;
int ret = -1;
struct strbuf key_stdout = STRBUF_INIT, key_stderr = STRBUF_INIT;
struct strbuf **keys;
char *key_command = NULL;
const char **argv;
int n;
char *default_key = NULL;
const char *literal_key = NULL;
char *begin, *new_line, *first_line;

if (!ssh_default_key_command)
die(_("either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured"));
@ -884,19 +887,24 @@ static char *get_default_ssh_signing_key(void)
&key_stderr, 0);

if (!ret) {
keys = strbuf_split_max(&key_stdout, '\n', 2);
if (keys[0] && is_literal_ssh_key(keys[0]->buf, &literal_key)) {
begin = key_stdout.buf;
new_line = strchr(begin, '\n');
if (new_line)
first_line = xmemdupz(begin, new_line - begin);
else
first_line = xstrdup(begin);
if (is_literal_ssh_key(first_line, &literal_key)) {
/*
* We only use `is_literal_ssh_key` here to check validity
* The prefix will be stripped when the key is used.
*/
default_key = strbuf_detach(keys[0], NULL);
default_key = first_line;
} else {
free(first_line);
warning(_("gpg.ssh.defaultKeyCommand succeeded but returned no keys: %s %s"),
key_stderr.buf, key_stdout.buf);
}

strbuf_list_free(keys);
} else {
warning(_("gpg.ssh.defaultKeyCommand failed: %s %s"),
key_stderr.buf, key_stdout.buf);