mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-03 12:11:33 +01:00
common,gpg: Fix processing of search descriptions ending in '!'.
* g10/gpg.c (check_user_ids): If the search description describes a keyid or fingerprint and ends in a '!', include the '!' in the rewritten description. * common/userids.c (classify_user_id): Accept keyids and fingerprints ending in '!'. -- Signed-off-by: Neal H. Walfield <neal@g10code.com> Reported-by: Kristian Fiskerstrand <kristian.fiskerstrand@sumptuouscapital.com> Fixes-commit: f99830b7 Fixes-commit: e8c53fca
This commit is contained in:
parent
9c34711539
commit
10cca02c4c
@ -282,7 +282,9 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
|
|||||||
if (desc->exact)
|
if (desc->exact)
|
||||||
hexlength--; /* Remove the bang. */
|
hexlength--; /* Remove the bang. */
|
||||||
|
|
||||||
if ((hexlength == 8 && s[hexlength] == 0)
|
if ((hexlength == 8
|
||||||
|
&& (s[hexlength] == 0
|
||||||
|
|| (s[hexlength] == '!' && s[hexlength + 1] == 0)))
|
||||||
|| (!hexprefix && hexlength == 9 && *s == '0'))
|
|| (!hexprefix && hexlength == 9 && *s == '0'))
|
||||||
{
|
{
|
||||||
/* Short keyid. */
|
/* Short keyid. */
|
||||||
@ -291,7 +293,9 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
|
|||||||
desc->u.kid[1] = strtoul( s, NULL, 16 );
|
desc->u.kid[1] = strtoul( s, NULL, 16 );
|
||||||
mode = KEYDB_SEARCH_MODE_SHORT_KID;
|
mode = KEYDB_SEARCH_MODE_SHORT_KID;
|
||||||
}
|
}
|
||||||
else if ((hexlength == 16 && s[hexlength] == 0)
|
else if ((hexlength == 16
|
||||||
|
&& (s[hexlength] == 0
|
||||||
|
|| (s[hexlength] == '!' && s[hexlength + 1] == 0)))
|
||||||
|| (!hexprefix && hexlength == 17 && *s == '0'))
|
|| (!hexprefix && hexlength == 17 && *s == '0'))
|
||||||
{
|
{
|
||||||
/* Long keyid. */
|
/* Long keyid. */
|
||||||
@ -303,7 +307,9 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
|
|||||||
desc->u.kid[1] = strtoul (s+8, NULL, 16);
|
desc->u.kid[1] = strtoul (s+8, NULL, 16);
|
||||||
mode = KEYDB_SEARCH_MODE_LONG_KID;
|
mode = KEYDB_SEARCH_MODE_LONG_KID;
|
||||||
}
|
}
|
||||||
else if ((hexlength == 32 && s[hexlength] == 0)
|
else if ((hexlength == 32
|
||||||
|
&& (s[hexlength] == 0
|
||||||
|
|| (s[hexlength] == '!' && s[hexlength + 1] == 0)))
|
||||||
|| (!hexprefix && hexlength == 33 && *s == '0'))
|
|| (!hexprefix && hexlength == 33 && *s == '0'))
|
||||||
{
|
{
|
||||||
/* MD5 fingerprint. */
|
/* MD5 fingerprint. */
|
||||||
@ -323,7 +329,9 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
|
|||||||
}
|
}
|
||||||
mode = KEYDB_SEARCH_MODE_FPR16;
|
mode = KEYDB_SEARCH_MODE_FPR16;
|
||||||
}
|
}
|
||||||
else if ((hexlength == 40 && s[hexlength] == 0)
|
else if ((hexlength == 40
|
||||||
|
&& (s[hexlength] == 0
|
||||||
|
|| (s[hexlength] == '!' && s[hexlength + 1] == 0)))
|
||||||
|| (!hexprefix && hexlength == 41 && *s == '0'))
|
|| (!hexprefix && hexlength == 41 && *s == '0'))
|
||||||
{
|
{
|
||||||
/* SHA1/RMD160 fingerprint. */
|
/* SHA1/RMD160 fingerprint. */
|
||||||
|
14
g10/gpg.c
14
g10/gpg.c
@ -2109,7 +2109,8 @@ check_user_ids (strlist_t *sp,
|
|||||||
PKT_public_key *pk;
|
PKT_public_key *pk;
|
||||||
char fingerprint_bin[MAX_FINGERPRINT_LEN];
|
char fingerprint_bin[MAX_FINGERPRINT_LEN];
|
||||||
size_t fingerprint_bin_len = sizeof (fingerprint_bin);
|
size_t fingerprint_bin_len = sizeof (fingerprint_bin);
|
||||||
char fingerprint[2 * MAX_FINGERPRINT_LEN + 1];
|
/* We also potentially need a ! at the end. */
|
||||||
|
char fingerprint[2 * MAX_FINGERPRINT_LEN + 1 + 1];
|
||||||
|
|
||||||
|
|
||||||
switch (t->flags >> 2)
|
switch (t->flags >> 2)
|
||||||
@ -2198,6 +2199,17 @@ check_user_ids (strlist_t *sp,
|
|||||||
fingerprint_from_pk (pk, fingerprint_bin, &fingerprint_bin_len);
|
fingerprint_from_pk (pk, fingerprint_bin, &fingerprint_bin_len);
|
||||||
assert (fingerprint_bin_len == sizeof (fingerprint_bin));
|
assert (fingerprint_bin_len == sizeof (fingerprint_bin));
|
||||||
bin2hex (fingerprint_bin, MAX_FINGERPRINT_LEN, fingerprint);
|
bin2hex (fingerprint_bin, MAX_FINGERPRINT_LEN, fingerprint);
|
||||||
|
if ((desc.mode == KEYDB_SEARCH_MODE_SHORT_KID
|
||||||
|
|| desc.mode == KEYDB_SEARCH_MODE_LONG_KID
|
||||||
|
|| desc.mode == KEYDB_SEARCH_MODE_FPR16
|
||||||
|
|| desc.mode == KEYDB_SEARCH_MODE_FPR20)
|
||||||
|
&& strchr (t->d, '!'))
|
||||||
|
{
|
||||||
|
int i = strlen (fingerprint);
|
||||||
|
fingerprint[i] = '!';
|
||||||
|
fingerprint[i + 1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
add_to_strlist (&s2, fingerprint);
|
add_to_strlist (&s2, fingerprint);
|
||||||
s2->flags = s->flags;
|
s2->flags = s->flags;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user