diff options
author | NIIBE Yutaka <[email protected]> | 2016-07-19 01:53:39 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2016-07-19 01:53:39 +0000 |
commit | 0c1fd4e9884ed7c1edd1819762b9e8a77f606ed3 (patch) | |
tree | c35e775e6f0faf96ebe3e612bd63c642b22f3a90 /scd/command.c | |
parent | agent: Fix passphrase cache lookups. (diff) | |
download | gnupg-0c1fd4e9884ed7c1edd1819762b9e8a77f606ed3.tar.gz gnupg-0c1fd4e9884ed7c1edd1819762b9e8a77f606ed3.zip |
scd: Fix race conditions for release_application.
* scd/command.c (do_reset, cmd_restart): Reset app_ctx before calling
release_application.
--
Thanks to Ben Warren for the report.
Signed-off-by: NIIBE Yutaka <[email protected]>
Diffstat (limited to '')
-rw-r--r-- | scd/command.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/scd/command.c b/scd/command.c index a4a2ba056..5842ee752 100644 --- a/scd/command.c +++ b/scd/command.c @@ -261,6 +261,7 @@ do_reset (ctrl_t ctrl, int send_reset) int vrdr = ctrl->server_local->vreader_idx; int slot; int err; + struct app_ctx_s *app = ctrl->app_ctx; if (!(vrdr == -1 || (vrdr >= 0 && vrdr < DIM(vreader_table)))) BUG (); @@ -268,10 +269,10 @@ do_reset (ctrl_t ctrl, int send_reset) /* If there is an active application, release it. Tell all other sessions using the same application to release the application. */ - if (ctrl->app_ctx) + if (app) { - release_application (ctrl->app_ctx); ctrl->app_ctx = NULL; + release_application (app); if (send_reset) { struct server_local_s *sl; @@ -1742,13 +1743,14 @@ static gpg_error_t cmd_restart (assuan_context_t ctx, char *line) { ctrl_t ctrl = assuan_get_pointer (ctx); + struct app_ctx_s *app = ctrl->app_ctx; (void)line; - if (ctrl->app_ctx) + if (app) { - release_application (ctrl->app_ctx); ctrl->app_ctx = NULL; + release_application (app); } if (locked_session && ctrl->server_local == locked_session) { |