aboutsummaryrefslogtreecommitdiffstats
path: root/gpg-interface.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2022-02-09 14:21:00 -0800
committerJunio C Hamano <gitster@pobox.com>2022-02-09 14:21:00 -0800
commitbd75856ef73adce98f2492ea1534f178e93c6785 (patch)
tree492bb998044be900f616ee84a0b8d320161bccdd /gpg-interface.c
parentd9976b184596e499e6ce5e0a61d17ef688d1e247 (diff)
parentcaeef01ea73ba126a6cd4dbf4a4564ecdca9a32c (diff)
downloadgit-bd75856ef73adce98f2492ea1534f178e93c6785.tar.gz
Merge branch 'fs/ssh-signing-crlf'
The code path that verifies signatures made with ssh were made to work better on a system with CRLF line endings. * fs/ssh-signing-crlf: gpg-interface: trim CR from ssh-keygen
Diffstat (limited to 'gpg-interface.c')
-rw-r--r--gpg-interface.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/gpg-interface.c b/gpg-interface.c
index b52eb0e2e0..17b1e44baa 100644
--- a/gpg-interface.c
+++ b/gpg-interface.c
@@ -433,7 +433,6 @@ static int verify_ssh_signed_buffer(struct signature_check *sigc,
struct tempfile *buffer_file;
int ret = -1;
const char *line;
- size_t trust_size;
char *principal;
struct strbuf ssh_principals_out = STRBUF_INIT;
struct strbuf ssh_principals_err = STRBUF_INIT;
@@ -502,15 +501,30 @@ static int verify_ssh_signed_buffer(struct signature_check *sigc,
ret = -1;
} else {
/* Check every principal we found (one per line) */
- for (line = ssh_principals_out.buf; *line;
- line = strchrnul(line + 1, '\n')) {
- while (*line == '\n')
- line++;
- if (!*line)
- break;
-
- trust_size = strcspn(line, "\n");
- principal = xmemdupz(line, trust_size);
+ const char *next;
+ for (line = ssh_principals_out.buf;
+ *line;
+ line = next) {
+ const char *end_of_text;
+
+ next = end_of_text = strchrnul(line, '\n');
+
+ /* Did we find a LF, and did we have CR before it? */
+ if (*end_of_text &&
+ line < end_of_text &&
+ end_of_text[-1] == '\r')
+ end_of_text--;
+
+ /* Unless we hit NUL, skip over the LF we found */
+ if (*next)
+ next++;
+
+ /* Not all lines are data. Skip empty ones */
+ if (line == end_of_text)
+ continue;
+
+ /* We now know we have an non-empty line. Process it */
+ principal = xmemdupz(line, end_of_text - line);
child_process_init(&ssh_keygen);
strbuf_release(&ssh_keygen_out);