1
0
Fork 0
mirror of git://git.gnupg.org/gnupg.git synced 2025-07-03 22:56:33 +02:00

kbx: Fix keyboxd searching with multiple patterns.

* kbx/keybox-search-desc.h (struct keydb_search_desc): New flag
name_used.
* common/userids.c (classify_user_id): Set flag.
* kbx/kbxserver.c (struct search_backing_store_s): New.
(cmd_search): use a backing store for the const pointers.
(kbxd_start_command_handler): Release the backing store.
--

Well, the search object partly uses buffers but also const
pointers (for strings and the serial number).  This when assigning
such objects to an another one we should really take a deep copy and
not just copy the pointer.  The more clean solution would have been to
provide a storage option the search object but that needs checking the
code at too many places so that I decided to use a separate backing
store array here.

Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2021-07-08 13:55:18 +02:00
parent 044e5a3c38
commit 101ba4f18a
No known key found for this signature in database
GPG key ID: E3FDFF218E45B72B
3 changed files with 95 additions and 10 deletions

View file

@ -115,6 +115,7 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
mode = KEYDB_SEARCH_MODE_MAILEND;
s++;
desc->u.name = s;
desc->name_used = 1;
break;
case '<': /* An email address. */
@ -126,24 +127,28 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
if (!openpgp_hack)
s++;
desc->u.name = s;
desc->name_used = 1;
break;
case '@': /* Part of an email address. */
mode = KEYDB_SEARCH_MODE_MAILSUB;
s++;
desc->u.name = s;
desc->name_used = 1;
break;
case '=': /* Exact compare. */
mode = KEYDB_SEARCH_MODE_EXACT;
s++;
desc->u.name = s;
desc->name_used = 1;
break;
case '*': /* Case insensitive substring search. */
mode = KEYDB_SEARCH_MODE_SUBSTR;
s++;
desc->u.name = s;
desc->name_used = 1;
break;
case '+': /* Compare individual words. Note that this has not
@ -151,6 +156,7 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
mode = KEYDB_SEARCH_MODE_WORDS;
s++;
desc->u.name = s;
desc->name_used = 1;
break;
case '/': /* Subject's DN. */
@ -161,6 +167,7 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
goto out;
}
desc->u.name = s;
desc->name_used = 1;
mode = KEYDB_SEARCH_MODE_SUBJECT;
break;
@ -178,6 +185,7 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
goto out;
}
desc->u.name = s;
desc->name_used = 1;
mode = KEYDB_SEARCH_MODE_ISSUER;
}
else
@ -205,6 +213,7 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
goto out;
}
desc->u.name = s;
desc->name_used = 1;
mode = KEYDB_SEARCH_MODE_ISSUER_SN;
}
}
@ -472,6 +481,7 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
if (!mode) /* Default to substring search. */
{
desc->u.name = s;
desc->name_used = 1;
mode = KEYDB_SEARCH_MODE_SUBSTR;
}
}