mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
scd: Add explict functions for 'app' reference counting.
* scd/app.c (app_ref): New. (app_unref): New. (release_application): Renamed to ... (app_unref_locked): this and remove arg locked_already. Change callers to use this or app_ref. * scd/command.c (open_card_with_request): (cmd_pksign, cmd_pkauth, cmd_pkdecrypt): Use app_ref and app_unref instead of accessing the counter directly. -- This is better in case we need to debug stuff. There is a real change however: We now lock and unlock the app before changing the reference count. The whole app locking business should be reviewed because we pass pointers along without immediately bumping the refcount. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
70f7b26287
commit
c594dcfc93
4 changed files with 55 additions and 23 deletions
|
@ -234,7 +234,7 @@ open_card_with_request (ctrl_t ctrl, const char *apptype, const char *serialno)
|
|||
|
||||
/* Re-scan USB devices. Release APP, before the scan. */
|
||||
ctrl->app_ctx = NULL;
|
||||
release_application (app, 0);
|
||||
app_unref (app);
|
||||
|
||||
if (serialno)
|
||||
serialno_bin = hex_to_buffer (serialno, &serialno_bin_len);
|
||||
|
@ -804,14 +804,14 @@ cmd_pksign (assuan_context_t ctx, char *line)
|
|||
if (app)
|
||||
{
|
||||
if (direct)
|
||||
app->ref_count++;
|
||||
app_ref (app);
|
||||
rc = app_sign (app, ctrl,
|
||||
keyidstr, hash_algo,
|
||||
pin_cb, ctx,
|
||||
ctrl->in_data.value, ctrl->in_data.valuelen,
|
||||
&outdata, &outdatalen);
|
||||
if (direct)
|
||||
app->ref_count--;
|
||||
app_unref (app);
|
||||
}
|
||||
else
|
||||
rc = gpg_error (GPG_ERR_NO_SECKEY);
|
||||
|
@ -872,12 +872,12 @@ cmd_pkauth (assuan_context_t ctx, char *line)
|
|||
if (app)
|
||||
{
|
||||
if (direct)
|
||||
app->ref_count++;
|
||||
app_ref (app);
|
||||
rc = app_auth (app, ctrl, keyidstr, pin_cb, ctx,
|
||||
ctrl->in_data.value, ctrl->in_data.valuelen,
|
||||
&outdata, &outdatalen);
|
||||
if (direct)
|
||||
app->ref_count--;
|
||||
app_unref (app);
|
||||
}
|
||||
else
|
||||
rc = gpg_error (GPG_ERR_NO_SECKEY);
|
||||
|
@ -933,12 +933,12 @@ cmd_pkdecrypt (assuan_context_t ctx, char *line)
|
|||
if (app)
|
||||
{
|
||||
if (direct)
|
||||
app->ref_count++;
|
||||
app_ref (app);
|
||||
rc = app_decipher (ctrl->app_ctx, ctrl, keyidstr, pin_cb, ctx,
|
||||
ctrl->in_data.value, ctrl->in_data.valuelen,
|
||||
&outdata, &outdatalen, &infoflags);
|
||||
if (direct)
|
||||
app->ref_count--;
|
||||
app_unref (app);
|
||||
}
|
||||
else
|
||||
rc = gpg_error (GPG_ERR_NO_SECKEY);
|
||||
|
@ -1648,7 +1648,7 @@ cmd_restart (assuan_context_t ctx, char *line)
|
|||
if (app)
|
||||
{
|
||||
ctrl->app_ctx = NULL;
|
||||
release_application (app, 0);
|
||||
app_unref (app);
|
||||
}
|
||||
if (locked_session && ctrl->server_local == locked_session)
|
||||
{
|
||||
|
@ -2169,7 +2169,8 @@ popup_prompt (void *opaque, int on)
|
|||
}
|
||||
|
||||
|
||||
/* Helper to send the clients a status change notification. */
|
||||
/* Helper to send the clients a status change notification. Note that
|
||||
* this fucntion assumes that APP is already locked. */
|
||||
void
|
||||
send_client_notifications (app_t app, int removal)
|
||||
{
|
||||
|
@ -2199,7 +2200,7 @@ send_client_notifications (app_t app, int removal)
|
|||
{
|
||||
sl->ctrl_backlink->app_ctx = NULL;
|
||||
sl->card_removed = 1;
|
||||
release_application (app, 1);
|
||||
app_unref_locked (app);
|
||||
}
|
||||
|
||||
if (!sl->event_signal || !sl->assuan_ctx)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue