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.
This commit is contained in:
Werner Koch 2022-09-28 15:40:22 +02:00
parent 1b0c17dfab
commit 536b5cd663
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
2 changed files with 18 additions and 15 deletions

View File

@ -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;
}

View File

@ -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);