1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-06-07 23:27:48 +02:00

scd: Slight change to app->fnc.do_with_keygrip.

* scd/app-openpgp.c (do_with_keygrip): Return a real error code to
avoid misinterpretation of the result.  Also fix the case for a too
small buffer.
--

The only real chnage is the case for a too small buffer.  That should
in general never happen but if so we now return an error instead of
success.

Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2019-06-17 14:35:21 +02:00
parent 479c2775d5
commit 70f7b26287
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
3 changed files with 36 additions and 13 deletions

View File

@ -126,11 +126,13 @@ struct app_ctx_s {
gpg_error_t (*check_pin) (app_t app, const char *keyidstr, gpg_error_t (*check_pin) (app_t app, const char *keyidstr,
gpg_error_t (*pincb)(void*, const char *, char **), gpg_error_t (*pincb)(void*, const char *, char **),
void *pincb_arg); void *pincb_arg);
int (*with_keygrip) (app_t app, ctrl_t ctrl, int action, gpg_error_t (*with_keygrip) (app_t app, ctrl_t ctrl, int action,
const char *keygrip_str); const char *keygrip_str);
} fnc; } fnc;
}; };
/* Action values for app_do_with_keygrip. */
enum enum
{ {
KEYGRIP_ACTION_SEND_DATA, KEYGRIP_ACTION_SEND_DATA,
@ -138,6 +140,7 @@ enum
KEYGRIP_ACTION_LOOKUP KEYGRIP_ACTION_LOOKUP
}; };
/*-- app-help.c --*/ /*-- app-help.c --*/
unsigned int app_help_count_bits (const unsigned char *a, size_t len); unsigned int app_help_count_bits (const unsigned char *a, size_t len);
gpg_error_t app_help_get_keygrip_string_pk (const void *pk, size_t pklen, gpg_error_t app_help_get_keygrip_string_pk (const void *pk, size_t pklen,

View File

@ -4913,7 +4913,7 @@ do_check_pin (app_t app, const char *keyidstr,
return verify_chv2 (app, pincb, pincb_arg); return verify_chv2 (app, pincb, pincb_arg);
} }
static int static gpg_error_t
do_with_keygrip (app_t app, ctrl_t ctrl, int action, const char *keygrip_str) do_with_keygrip (app_t app, ctrl_t ctrl, int action, const char *keygrip_str)
{ {
int i; int i;
@ -4925,14 +4925,12 @@ do_with_keygrip (app_t app, ctrl_t ctrl, int action, const char *keygrip_str)
if (action == KEYGRIP_ACTION_LOOKUP) if (action == KEYGRIP_ACTION_LOOKUP)
{ {
if (keygrip_str == NULL) if (keygrip_str == NULL)
return 1; return gpg_error (GPG_ERR_NOT_FOUND);
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
if (app->app_local->pk[i].read_done if (app->app_local->pk[i].read_done
&& !strcmp (keygrip_str, app->app_local->pk[i].keygrip_str)) && !strcmp (keygrip_str, app->app_local->pk[i].keygrip_str))
return 0; /* Found */ return 0; /* Found */
return 1;
} }
else else
{ {
@ -4941,7 +4939,7 @@ do_with_keygrip (app_t app, ctrl_t ctrl, int action, const char *keygrip_str)
int data = (action == KEYGRIP_ACTION_SEND_DATA); int data = (action == KEYGRIP_ACTION_SEND_DATA);
if (DIM (buf) < 2 * app->serialnolen + 1) if (DIM (buf) < 2 * app->serialnolen + 1)
return 0; return gpg_error (GPG_ERR_BUFFER_TOO_SHORT);
bin2hex (app->serialno, app->serialnolen, buf); bin2hex (app->serialno, app->serialnolen, buf);
@ -4954,6 +4952,10 @@ do_with_keygrip (app_t app, ctrl_t ctrl, int action, const char *keygrip_str)
send_keyinfo (ctrl, data, send_keyinfo (ctrl, data,
app->app_local->pk[i].keygrip_str,buf, idbuf); app->app_local->pk[i].keygrip_str,buf, idbuf);
} }
/* Return an error so that the dispatcher keeps on looping
* over the other applications. Only for clarity we use a
* different error code than for the not_found case. */
return gpg_error (GPG_ERR_TRUE);
} }
else else
{ {
@ -4966,9 +4968,9 @@ do_with_keygrip (app_t app, ctrl_t ctrl, int action, const char *keygrip_str)
return 0; return 0;
} }
} }
return 1;
} }
return gpg_error (GPG_ERR_NOT_FOUND);
} }
/* Show information about card capabilities. */ /* Show information about card capabilities. */

View File

@ -1292,9 +1292,27 @@ app_send_card_list (ctrl_t ctrl)
} }
/* Execute an action for each app. ACTION can be one of: /* Execute an action for each app. ACTION can be one of:
KEYGRIP_ACTION_SEND_DATA: send data if KEYGRIP_STR matches *
KEYGRIP_ACTION_WRITE_STATUS: write status if KEYGRIP_STR matches * - KEYGRIP_ACTION_SEND_DATA
KEYGRIP_ACTION_LOOKUP: Return matching APP *
* If KEYGRIP_STR matches a public key of any active application
* send information as LF terminated data lines about the public
* key. The format of these lines is
* <keygrip> T <serialno> <idstr>
* If a match was found a pointer to the matching application is
* returned. With the KEYGRIP_STR given as NULL, lines for all
* keys will be send and the return value is NULL.
*
* - KEYGRIP_ACTION_WRITE_STATUS
*
* Same as KEYGRIP_ACTION_SEND_DATA but uses status lines instead
* of data lines.
*
* - KEYGRIP_ACTION_LOOKUP
*
* Returns a pointer to the application matching KEYGRIP_STR but
* does not emit any status or data lines. If no key with that
* keygrip is available or KEYGRIP_STR is NULL, NULL is returned.
*/ */
app_t app_t
app_do_with_keygrip (ctrl_t ctrl, int action, const char *keygrip_str) app_do_with_keygrip (ctrl_t ctrl, int action, const char *keygrip_str)