mirror of
git://git.gnupg.org/gnupg.git
synced 2025-04-12 22:11:29 +02:00
Fixed a nasty bug in scdaemon which led to a card reset if the card was
inserted during scdaemon startup and a connection was made before the ticker had a chance to run. Add some stuff for better debugging.
This commit is contained in:
parent
ae63e6da8d
commit
618afc4231
@ -2065,7 +2065,7 @@ check_own_socket (void)
|
|||||||
tattr = pth_attr_new();
|
tattr = pth_attr_new();
|
||||||
pth_attr_set (tattr, PTH_ATTR_JOINABLE, 0);
|
pth_attr_set (tattr, PTH_ATTR_JOINABLE, 0);
|
||||||
pth_attr_set (tattr, PTH_ATTR_STACK_SIZE, 256*1024);
|
pth_attr_set (tattr, PTH_ATTR_STACK_SIZE, 256*1024);
|
||||||
pth_attr_set (tattr, PTH_ATTR_NAME, "check-owb-socket");
|
pth_attr_set (tattr, PTH_ATTR_NAME, "check-own-socket");
|
||||||
|
|
||||||
if (!pth_spawn (tattr, check_own_socket_thread, sockname))
|
if (!pth_spawn (tattr, check_own_socket_thread, sockname))
|
||||||
log_error ("error spawning check_own_socket_thread: %s\n",
|
log_error ("error spawning check_own_socket_thread: %s\n",
|
||||||
|
@ -205,6 +205,10 @@ aborts. For debugging purposes it is sometimes better to allow core
|
|||||||
dump. This options enables it and also changes the working directory to
|
dump. This options enables it and also changes the working directory to
|
||||||
@file{/tmp} when running in @option{--server} mode.
|
@file{/tmp} when running in @option{--server} mode.
|
||||||
|
|
||||||
|
@item --debug-log-tid
|
||||||
|
@opindex debug-log-tid
|
||||||
|
This option appends a thread ID to the PID in the log output.
|
||||||
|
|
||||||
|
|
||||||
@item --no-detach
|
@item --no-detach
|
||||||
@opindex no-detach
|
@opindex no-detach
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
2009-02-25 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
|
* logging.c (get_tid_callback): New.
|
||||||
|
(do_logv): Use it.
|
||||||
|
(log_set_get_tid_callback): New.
|
||||||
|
|
||||||
2009-01-22 Werner Koch <wk@g10code.com>
|
2009-01-22 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
* t-support.c (gpg_err_code_from_errno)
|
* t-support.c (gpg_err_code_from_errno)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* logging.c - Useful logging functions
|
/* logging.c - Useful logging functions
|
||||||
* Copyright (C) 1998, 1999, 2000, 2001, 2003,
|
* Copyright (C) 1998, 1999, 2000, 2001, 2003,
|
||||||
* 2004, 2005, 2006 Free Software Foundation, Inc.
|
* 2004, 2005, 2006, 2009 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of JNLIB.
|
* This file is part of JNLIB.
|
||||||
*
|
*
|
||||||
@ -61,6 +61,7 @@ static char prefix_buffer[80];
|
|||||||
static int with_time;
|
static int with_time;
|
||||||
static int with_prefix;
|
static int with_prefix;
|
||||||
static int with_pid;
|
static int with_pid;
|
||||||
|
static unsigned long (*get_tid_callback)(void);
|
||||||
static int running_detached;
|
static int running_detached;
|
||||||
static int force_prefixes;
|
static int force_prefixes;
|
||||||
|
|
||||||
@ -365,6 +366,13 @@ log_set_fd (int fd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
log_set_get_tid_callback (unsigned long (*cb)(void))
|
||||||
|
{
|
||||||
|
get_tid_callback = cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
log_set_prefix (const char *text, unsigned int flags)
|
log_set_prefix (const char *text, unsigned int flags)
|
||||||
{
|
{
|
||||||
@ -460,7 +468,13 @@ do_logv (int level, const char *fmt, va_list arg_ptr)
|
|||||||
if (with_prefix || force_prefixes)
|
if (with_prefix || force_prefixes)
|
||||||
fputs (prefix_buffer, logstream);
|
fputs (prefix_buffer, logstream);
|
||||||
if (with_pid || force_prefixes)
|
if (with_pid || force_prefixes)
|
||||||
fprintf (logstream, "[%u]", (unsigned int)getpid ());
|
{
|
||||||
|
if (get_tid_callback)
|
||||||
|
fprintf (logstream, "[%u.%lx]",
|
||||||
|
(unsigned int)getpid (), get_tid_callback ());
|
||||||
|
else
|
||||||
|
fprintf (logstream, "[%u]", (unsigned int)getpid ());
|
||||||
|
}
|
||||||
if (!with_time || force_prefixes)
|
if (!with_time || force_prefixes)
|
||||||
putc (':', logstream);
|
putc (':', logstream);
|
||||||
/* A leading backspace suppresses the extra space so that we can
|
/* A leading backspace suppresses the extra space so that we can
|
||||||
|
@ -33,6 +33,7 @@ int log_get_errorcount (int clear);
|
|||||||
void log_inc_errorcount (void);
|
void log_inc_errorcount (void);
|
||||||
void log_set_file( const char *name );
|
void log_set_file( const char *name );
|
||||||
void log_set_fd (int fd);
|
void log_set_fd (int fd);
|
||||||
|
void log_set_get_tid_callback (unsigned long (*cb)(void));
|
||||||
void log_set_prefix (const char *text, unsigned int flags);
|
void log_set_prefix (const char *text, unsigned int flags);
|
||||||
const char *log_get_prefix (unsigned int *flags);
|
const char *log_get_prefix (unsigned int *flags);
|
||||||
int log_test_fd (int fd);
|
int log_test_fd (int fd);
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
2009-02-25 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
|
* apdu.c (apdu_get_status): Factor all code out to ...
|
||||||
|
(apdu_private_get_status): .. new. Add arg NO_ATR_RESET.
|
||||||
|
(apdu_connect): Call new function.
|
||||||
|
|
||||||
|
* scdaemon.c: New option --debug-log-tid.
|
||||||
|
(tid_log_callback): New.
|
||||||
|
(main): Move debug-wait code after debug stream init.
|
||||||
|
|
||||||
2009-02-24 Werner Koch <wk@g10code.com>
|
2009-02-24 Werner Koch <wk@g10code.com>
|
||||||
|
|
||||||
* ccid-driver.c (ccid_get_atr): Move debug output to ..
|
* ccid-driver.c (ccid_get_atr): Move debug output to ..
|
||||||
|
34
scd/apdu.c
34
scd/apdu.c
@ -1,5 +1,5 @@
|
|||||||
/* apdu.c - ISO 7816 APDU functions and low level I/O
|
/* apdu.c - ISO 7816 APDU functions and low level I/O
|
||||||
* Copyright (C) 2003, 2004, 2008 Free Software Foundation, Inc.
|
* Copyright (C) 2003, 2004, 2008, 2009 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of GnuPG.
|
* This file is part of GnuPG.
|
||||||
*
|
*
|
||||||
@ -295,6 +295,9 @@ long (* DLSTDCALL pcsc_set_timeout) (unsigned long context,
|
|||||||
/* Prototypes. */
|
/* Prototypes. */
|
||||||
static int pcsc_get_status (int slot, unsigned int *status);
|
static int pcsc_get_status (int slot, unsigned int *status);
|
||||||
static int reset_pcsc_reader (int slot);
|
static int reset_pcsc_reader (int slot);
|
||||||
|
static int apdu_get_status_internal (int slot, int hang, int no_atr_reset,
|
||||||
|
unsigned int *status,
|
||||||
|
unsigned int *changed);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -2565,9 +2568,18 @@ apdu_connect (int slot)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
sw = 0;
|
sw = 0;
|
||||||
|
|
||||||
|
/* We need to call apdu_get_status_internal, so that the last-status
|
||||||
|
machinery gets setup properly even if a card is inserted while
|
||||||
|
scdaemon is fired up and apdu_get_status has not yet been called.
|
||||||
|
Without that we would force a reset of the card with the next
|
||||||
|
call to apdu_get_status. */
|
||||||
|
apdu_get_status_internal (slot, 1, 1, NULL, NULL);
|
||||||
|
|
||||||
return sw;
|
return sw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
apdu_disconnect (int slot)
|
apdu_disconnect (int slot)
|
||||||
{
|
{
|
||||||
@ -2706,9 +2718,9 @@ apdu_get_atr (int slot, size_t *atrlen)
|
|||||||
of card insertions. This value may be used to detect a card
|
of card insertions. This value may be used to detect a card
|
||||||
change.
|
change.
|
||||||
*/
|
*/
|
||||||
int
|
static int
|
||||||
apdu_get_status (int slot, int hang,
|
apdu_get_status_internal (int slot, int hang, int no_atr_reset,
|
||||||
unsigned int *status, unsigned int *changed)
|
unsigned int *status, unsigned int *changed)
|
||||||
{
|
{
|
||||||
int sw;
|
int sw;
|
||||||
unsigned int s;
|
unsigned int s;
|
||||||
@ -2736,8 +2748,9 @@ apdu_get_status (int slot, int hang,
|
|||||||
{
|
{
|
||||||
reader_table[slot].change_counter++;
|
reader_table[slot].change_counter++;
|
||||||
/* Make sure that the ATR is invalid so that a reset will be
|
/* Make sure that the ATR is invalid so that a reset will be
|
||||||
triggered by activate. */
|
triggered by apdu_activate. */
|
||||||
reader_table[slot].atrlen = 0;
|
if (!no_atr_reset)
|
||||||
|
reader_table[slot].atrlen = 0;
|
||||||
}
|
}
|
||||||
reader_table[slot].any_status = 1;
|
reader_table[slot].any_status = 1;
|
||||||
reader_table[slot].last_status = s;
|
reader_table[slot].last_status = s;
|
||||||
@ -2750,6 +2763,15 @@ apdu_get_status (int slot, int hang,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* See above for a description. */
|
||||||
|
int
|
||||||
|
apdu_get_status (int slot, int hang,
|
||||||
|
unsigned int *status, unsigned int *changed)
|
||||||
|
{
|
||||||
|
return apdu_get_status_internal (slot, hang, 0, status, changed);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Check whether the reader supports the ISO command code COMMAND on
|
/* Check whether the reader supports the ISO command code COMMAND on
|
||||||
the keypad. Return 0 on success. For a description of the pin
|
the keypad. Return 0 on success. For a description of the pin
|
||||||
parameters, see ccid-driver.c */
|
parameters, see ccid-driver.c */
|
||||||
|
@ -357,7 +357,7 @@ print_pr_data (const unsigned char *data, size_t datalen, size_t off)
|
|||||||
DEBUGOUT_CONT_1 (" %02X", data[off]);
|
DEBUGOUT_CONT_1 (" %02X", data[off]);
|
||||||
any = 1;
|
any = 1;
|
||||||
}
|
}
|
||||||
if (any && !(off % 16))
|
if (any && (off % 16))
|
||||||
DEBUGOUT_LF ();
|
DEBUGOUT_LF ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* scdaemon.c - The GnuPG Smartcard Daemon
|
/* scdaemon.c - The GnuPG Smartcard Daemon
|
||||||
* Copyright (C) 2001, 2002, 2004, 2005,
|
* Copyright (C) 2001, 2002, 2004, 2005,
|
||||||
* 2007, 2008 Free Software Foundation, Inc.
|
* 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of GnuPG.
|
* This file is part of GnuPG.
|
||||||
*
|
*
|
||||||
@ -69,6 +69,7 @@ enum cmd_and_opt_values
|
|||||||
oDebugWait,
|
oDebugWait,
|
||||||
oDebugAllowCoreDump,
|
oDebugAllowCoreDump,
|
||||||
oDebugCCIDDriver,
|
oDebugCCIDDriver,
|
||||||
|
oDebugLogTid,
|
||||||
oNoGreeting,
|
oNoGreeting,
|
||||||
oNoOptions,
|
oNoOptions,
|
||||||
oHomedir,
|
oHomedir,
|
||||||
@ -117,6 +118,7 @@ static ARGPARSE_OPTS opts[] = {
|
|||||||
ARGPARSE_s_n (oDebugAllowCoreDump, "debug-allow-core-dump", "@"),
|
ARGPARSE_s_n (oDebugAllowCoreDump, "debug-allow-core-dump", "@"),
|
||||||
ARGPARSE_s_n (oDebugCCIDDriver, "debug-ccid-driver", "@"),
|
ARGPARSE_s_n (oDebugCCIDDriver, "debug-ccid-driver", "@"),
|
||||||
ARGPARSE_s_n (oDebugDisableTicker, "debug-disable-ticker", "@"),
|
ARGPARSE_s_n (oDebugDisableTicker, "debug-disable-ticker", "@"),
|
||||||
|
ARGPARSE_s_n (oDebugLogTid, "debug-log-tid", "@"),
|
||||||
ARGPARSE_s_n (oNoDetach, "no-detach", N_("do not detach from the console")),
|
ARGPARSE_s_n (oNoDetach, "no-detach", N_("do not detach from the console")),
|
||||||
ARGPARSE_s_s (oLogFile, "log-file", N_("|FILE|write a log to FILE")),
|
ARGPARSE_s_s (oLogFile, "log-file", N_("|FILE|write a log to FILE")),
|
||||||
ARGPARSE_s_s (oReaderPort, "reader-port",
|
ARGPARSE_s_s (oReaderPort, "reader-port",
|
||||||
@ -263,6 +265,17 @@ my_strusage (int level)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static unsigned long
|
||||||
|
tid_log_callback (void)
|
||||||
|
{
|
||||||
|
#ifdef PTH_HAVE_PTH_THREAD_ID
|
||||||
|
return pth_thread_id ();
|
||||||
|
#else
|
||||||
|
return (unsigned long)pth_self ();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -505,6 +518,9 @@ main (int argc, char **argv )
|
|||||||
#endif /*HAVE_LIBUSB*/
|
#endif /*HAVE_LIBUSB*/
|
||||||
break;
|
break;
|
||||||
case oDebugDisableTicker: ticker_disabled = 1; break;
|
case oDebugDisableTicker: ticker_disabled = 1; break;
|
||||||
|
case oDebugLogTid:
|
||||||
|
log_set_get_tid_callback (tid_log_callback);
|
||||||
|
break;
|
||||||
|
|
||||||
case oOptions:
|
case oOptions:
|
||||||
/* config files may not be nested (silently ignore them) */
|
/* config files may not be nested (silently ignore them) */
|
||||||
@ -586,14 +602,6 @@ main (int argc, char **argv )
|
|||||||
|
|
||||||
set_debug (debug_level);
|
set_debug (debug_level);
|
||||||
|
|
||||||
if (debug_wait && pipe_server)
|
|
||||||
{
|
|
||||||
log_debug ("waiting for debugger - my pid is %u .....\n",
|
|
||||||
(unsigned int)getpid());
|
|
||||||
gnupg_sleep (debug_wait);
|
|
||||||
log_debug ("... okay\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
initialize_module_command ();
|
initialize_module_command ();
|
||||||
|
|
||||||
if (gpgconf_list == 2)
|
if (gpgconf_list == 2)
|
||||||
@ -638,13 +646,21 @@ main (int argc, char **argv )
|
|||||||
scd_exit (0);
|
scd_exit (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now start with logging to a file if this is desired */
|
/* Now start with logging to a file if this is desired. */
|
||||||
if (logfile)
|
if (logfile)
|
||||||
{
|
{
|
||||||
log_set_file (logfile);
|
log_set_file (logfile);
|
||||||
log_set_prefix (NULL, 1|2|4);
|
log_set_prefix (NULL, 1|2|4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (debug_wait && pipe_server)
|
||||||
|
{
|
||||||
|
log_debug ("waiting for debugger - my pid is %u .....\n",
|
||||||
|
(unsigned int)getpid());
|
||||||
|
gnupg_sleep (debug_wait);
|
||||||
|
log_debug ("... okay\n");
|
||||||
|
}
|
||||||
|
|
||||||
if (pipe_server)
|
if (pipe_server)
|
||||||
{
|
{
|
||||||
/* This is the simple pipe based server */
|
/* This is the simple pipe based server */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user