diff --git a/agent/command.c b/agent/command.c index b405ec61c..e6f34fd39 100644 --- a/agent/command.c +++ b/agent/command.c @@ -498,8 +498,11 @@ cmd_learn (ASSUAN_CONTEXT ctx, char *line) static int option_handler (ASSUAN_CONTEXT ctx, const char *key, const char *value) { - CTRL ctrl = assuan_get_pointer (ctx); +/* CTRL ctrl = assuan_get_pointer (ctx); */ + /* FIXME: We should not change opt. here. It is not a problem right + now but as soon as we are allowing concurrent connections we mess + things up */ if (!strcmp (key, "display")) { if (opt.display) diff --git a/scd/command.c b/scd/command.c index f62baae98..9e0ddc502 100644 --- a/scd/command.c +++ b/scd/command.c @@ -438,7 +438,7 @@ cmd_pksign (ASSUAN_CONTEXT ctx, char *line) /* We have to use a copy of the key ID because the function may use the pin_cb which in turn uses the assuan line buffer and thus overwriting the original line with the keyid */ - keyidstr = xtrystrdup (line); + keyidstr = strdup (line); if (!keyidstr) return ASSUAN_Out_Of_Core; rc = card_sign (ctrl->card_ctx, @@ -446,7 +446,7 @@ cmd_pksign (ASSUAN_CONTEXT ctx, char *line) pin_cb, ctx, ctrl->in_data.value, ctrl->in_data.valuelen, &outdata, &outdatalen); - xfree (keyidstr); + free (keyidstr); if (rc) { log_error ("card_sign failed: %s\n", gnupg_strerror (rc)); @@ -477,7 +477,7 @@ cmd_pkdecrypt (ASSUAN_CONTEXT ctx, char *line) if ((rc = open_card (ctrl))) return rc; - keyidstr = xtrystrdup (line); + keyidstr = strdup (line); if (!keyidstr) return ASSUAN_Out_Of_Core; rc = card_decipher (ctrl->card_ctx, @@ -485,7 +485,7 @@ cmd_pkdecrypt (ASSUAN_CONTEXT ctx, char *line) pin_cb, ctx, ctrl->in_data.value, ctrl->in_data.valuelen, &outdata, &outdatalen); - xfree (keyidstr); + free (keyidstr); if (rc) { log_error ("card_create_signature failed: %s\n", gnupg_strerror (rc)); diff --git a/sm/ChangeLog b/sm/ChangeLog index 639d78cb7..a594885e0 100644 --- a/sm/ChangeLog +++ b/sm/ChangeLog @@ -1,3 +1,8 @@ +2002-04-25 Werner Koch + + * call-agent.c (start_agent): Make copies of old locales and check + for setlocale. + 2002-04-25 Marcus Brinkmann * call-agent.c (start_agent): Fix error handling logic so the diff --git a/sm/call-agent.c b/sm/call-agent.c index b3b18aef7..11b88f183 100644 --- a/sm/call-agent.c +++ b/sm/call-agent.c @@ -264,8 +264,14 @@ start_agent (void) if (rc) return map_assuan_err (rc); } -#ifdef LC_CTYPE +#if defined(HAVE_SETLOCALE) && defined(LC_CTYPE) old_lc = setlocale (LC_CTYPE, NULL); + if (old_lc) + { + old_lc = strdup (old_lc); + if (!old_lc) + return GNUPG_Out_Of_Core; + } dft_lc = setlocale (LC_CTYPE, ""); #endif if (opt.lc_ctype || (dft_ttyname && dft_lc)) @@ -283,14 +289,23 @@ start_agent (void) rc = map_assuan_err (rc); } } -#ifdef LC_CTYPE +#if defined(HAVE_SETLOCALE) && defined(LC_CTYPE) if (old_lc) - setlocale (LC_CTYPE, old_lc); + { + setlocale (LC_CTYPE, old_lc); + free (old_lc); + } #endif if (rc) return rc; -#ifdef LC_MESSAGES +#if defined(HAVE_SETLOCALE) && defined(LC_MESSAGES) old_lc = setlocale (LC_MESSAGES, NULL); + if (old_lc) + { + old_lc = strdup (old_lc); + if (!old_lc) + return GNUPG_Out_Of_Core; + } dft_lc = setlocale (LC_MESSAGES, ""); #endif if (opt.lc_messages || (dft_ttyname && dft_lc)) @@ -308,9 +323,12 @@ start_agent (void) rc = map_assuan_err (rc); } } -#ifdef LC_MESSAGES +#if defined(HAVE_SETLOCALE) && defined(LC_MESSAGES) if (old_lc) - setlocale (LC_MESSAGES, old_lc); + { + setlocale (LC_MESSAGES, old_lc); + free (old_lc); + } #endif return rc;