mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
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>
This commit is contained in:
committed by
Junio C Hamano
parent
bee1bdd588
commit
2ab72a16d9
@@ -865,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"));
|
||||
@@ -887,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);
|
||||
|
||||
Reference in New Issue
Block a user