From 536b5cd6630506bb4bece61eb34b1d0a1c611231 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Wed, 28 Sep 2022 15:40:22 +0200 Subject: [PATCH] dirmngr: Fix lost flags during LDAP upload * dirmngr/ldapserver.c (ldapserver_parse_one): Turn LINE into a const. Use strtokenize instead of strtok style parsing. -- This fixes a problem with resulted in a General Error for the second key to be uploaded in the same session. But only if the colon format to specify a keyserver with flags was used. --- dirmngr/ldapserver.c | 31 +++++++++++++++++-------------- dirmngr/ldapserver.h | 2 +- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/dirmngr/ldapserver.c b/dirmngr/ldapserver.c index 14f87efb1..ed38c7101 100644 --- a/dirmngr/ldapserver.c +++ b/dirmngr/ldapserver.c @@ -69,18 +69,17 @@ ldapserver_list_free (ldap_server_t servers) * FILENAME and LINENO are used for diagnostic purposes only. */ ldap_server_t -ldapserver_parse_one (char *line, +ldapserver_parse_one (const char *line, const char *filename, unsigned int lineno) { char *p; - char *endp; const char *s; ldap_server_t server; int fieldno; int fail = 0; int i; + char **fields = NULL; - /* Parse the colon separated fields. */ server = xtrycalloc (1, sizeof *server); if (!server) { @@ -88,32 +87,35 @@ ldapserver_parse_one (char *line, goto leave; } - for (fieldno = 1, p = line; p; p = endp, fieldno++ ) + fields = strtokenize (line, ":"); + if (!fields) + { + fail = 1; + goto leave; + } + + for (fieldno=0; (p = fields[fieldno]); fieldno++) { - endp = strchr (p, ':'); - if (endp) - *endp++ = '\0'; - trim_spaces (p); switch (fieldno) { - case 1: + case 0: server->host = xtrystrdup (p); if (!server->host) fail = 1; break; - case 2: + case 1: if (*p) server->port = atoi (p); break; - case 3: + case 2: server->user = xtrystrdup (p); if (!server->user) fail = 1; break; - case 4: + case 3: if (*p && !server->user) { if (filename) @@ -131,7 +133,7 @@ ldapserver_parse_one (char *line, } break; - case 5: + case 4: if (*p) { server->base = xtrystrdup (p); @@ -140,7 +142,7 @@ ldapserver_parse_one (char *line, } break; - case 6: + case 5: { char **flags = NULL; @@ -211,6 +213,7 @@ ldapserver_parse_one (char *line, ldapserver_list_free (server); server = NULL; } + xfree (fields); return server; } diff --git a/dirmngr/ldapserver.h b/dirmngr/ldapserver.h index c62f5a939..4cd765c28 100644 --- a/dirmngr/ldapserver.h +++ b/dirmngr/ldapserver.h @@ -26,7 +26,7 @@ void ldapserver_list_free (ldap_server_t servers); -ldap_server_t ldapserver_parse_one (char *line, +ldap_server_t ldapserver_parse_one (const char *line, const char *filename, unsigned int lineno);