From bee0ac28c9c8027540ae56900b9f85e0bd555f1d Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Mon, 9 Apr 2012 20:52:22 -0400 Subject: Fix killing PID -1. When the KILLSCD command had been sent a race condition would occur causing PID -1 getting killed, which on Linux seems to terminate all applications for the current user. --- scd/apdu.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/scd/apdu.c b/scd/apdu.c index 064f0d636..8467b034c 100644 --- a/scd/apdu.c +++ b/scd/apdu.c @@ -1016,7 +1016,8 @@ pcsc_get_status_wrapped (int slot, unsigned int *status) close (slotp->pcsc.rsp_fd); slotp->pcsc.req_fd = -1; slotp->pcsc.rsp_fd = -1; - kill (slotp->pcsc.pid, SIGTERM); + if (slotp->pcsc.pid != -1) + kill (slotp->pcsc.pid, SIGTERM); slotp->pcsc.pid = (pid_t)(-1); slotp->used = 0; return sw; @@ -1180,7 +1181,8 @@ pcsc_send_apdu_wrapped (int slot, unsigned char *apdu, size_t apdulen, close (slotp->pcsc.rsp_fd); slotp->pcsc.req_fd = -1; slotp->pcsc.rsp_fd = -1; - kill (slotp->pcsc.pid, SIGTERM); + if (slotp->pcsc.pid != -1) + kill (slotp->pcsc.pid, SIGTERM); slotp->pcsc.pid = (pid_t)(-1); slotp->used = 0; return sw; @@ -1321,7 +1323,8 @@ control_pcsc_wrapped (int slot, unsigned long ioctl_code, close (slotp->pcsc.rsp_fd); slotp->pcsc.req_fd = -1; slotp->pcsc.rsp_fd = -1; - kill (slotp->pcsc.pid, SIGTERM); + if (slotp->pcsc.pid != -1) + kill (slotp->pcsc.pid, SIGTERM); slotp->pcsc.pid = (pid_t)(-1); slotp->used = 0; return pcsc_error_to_sw (err); @@ -1422,7 +1425,8 @@ close_pcsc_reader_wrapped (int slot) close (slotp->pcsc.rsp_fd); slotp->pcsc.req_fd = -1; slotp->pcsc.rsp_fd = -1; - kill (slotp->pcsc.pid, SIGTERM); + if (slotp->pcsc.pid != -1) + kill (slotp->pcsc.pid, SIGTERM); slotp->pcsc.pid = (pid_t)(-1); slotp->used = 0; return 0; @@ -1640,7 +1644,8 @@ reset_pcsc_reader_wrapped (int slot) close (slotp->pcsc.rsp_fd); slotp->pcsc.req_fd = -1; slotp->pcsc.rsp_fd = -1; - kill (slotp->pcsc.pid, SIGTERM); + if (slotp->pcsc.pid != -1) + kill (slotp->pcsc.pid, SIGTERM); slotp->pcsc.pid = (pid_t)(-1); slotp->used = 0; return sw; @@ -1965,7 +1970,8 @@ open_pcsc_reader_wrapped (const char *portstr) close (slotp->pcsc.rsp_fd); slotp->pcsc.req_fd = -1; slotp->pcsc.rsp_fd = -1; - kill (slotp->pcsc.pid, SIGTERM); + if (slotp->pcsc.pid != -1) + kill (slotp->pcsc.pid, SIGTERM); slotp->pcsc.pid = (pid_t)(-1); slotp->used = 0; /* There is no way to return SW. */ -- cgit v1.2.3