summaryrefslogtreecommitdiff
path: root/src/engine-gpgsm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine-gpgsm.c')
-rw-r--r--src/engine-gpgsm.c52
1 files changed, 32 insertions, 20 deletions
diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c
index d1be049..c3d5427 100644
--- a/src/engine-gpgsm.c
+++ b/src/engine-gpgsm.c
@@ -396,7 +396,7 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir,
goto leave;
if (dft_display)
{
- if (asprintf (&optstr, "OPTION display=%s", dft_display) < 0)
+ if (gpgrt_asprintf (&optstr, "OPTION display=%s", dft_display) < 0)
{
free (dft_display);
err = gpg_error_from_syserror ();
@@ -406,7 +406,7 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir,
err = assuan_transact (gpgsm->assuan_ctx, optstr, NULL, NULL, NULL,
NULL, NULL, NULL);
- free (optstr);
+ gpgrt_free (optstr);
if (err)
goto leave;
}
@@ -430,14 +430,14 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir,
ways, e.g., when /dev/pts is not accessible under chroot. */
if (!rc)
{
- if (asprintf (&optstr, "OPTION ttyname=%s", dft_ttyname) < 0)
+ if (gpgrt_asprintf (&optstr, "OPTION ttyname=%s", dft_ttyname) < 0)
{
err = gpg_error_from_syserror ();
goto leave;
}
err = assuan_transact (gpgsm->assuan_ctx, optstr, NULL, NULL, NULL,
NULL, NULL, NULL);
- free (optstr);
+ gpgrt_free (optstr);
if (err)
goto leave;
@@ -446,7 +446,7 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir,
goto leave;
if (dft_ttytype)
{
- if (asprintf (&optstr, "OPTION ttytype=%s", dft_ttytype) < 0)
+ if (gpgrt_asprintf (&optstr, "OPTION ttytype=%s", dft_ttytype)< 0)
{
free (dft_ttytype);
err = gpg_error_from_syserror ();
@@ -456,7 +456,7 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir,
err = assuan_transact (gpgsm->assuan_ctx, optstr, NULL, NULL,
NULL, NULL, NULL, NULL);
- free (optstr);
+ gpgrt_free (optstr);
if (err)
goto leave;
}
@@ -561,13 +561,13 @@ gpgsm_set_locale (void *engine, int category, const char *value)
if (!value)
return 0;
- if (asprintf (&optstr, "OPTION %s=%s", catstr, value) < 0)
+ if (gpgrt_asprintf (&optstr, "OPTION %s=%s", catstr, value) < 0)
err = gpg_error_from_syserror ();
else
{
err = assuan_transact (gpgsm->assuan_ctx, optstr, NULL, NULL,
NULL, NULL, NULL, NULL);
- free (optstr);
+ gpgrt_free (optstr);
}
return err;
@@ -593,7 +593,7 @@ gpgsm_assuan_simple_command (engine_gpgsm_t gpgsm, const char *cmd,
{
err = assuan_read_line (ctx, &line, &linelen);
if (err)
- return err;
+ break;
if (*line == '#' || !linelen)
continue;
@@ -601,7 +601,7 @@ gpgsm_assuan_simple_command (engine_gpgsm_t gpgsm, const char *cmd,
if (linelen >= 2
&& line[0] == 'O' && line[1] == 'K'
&& (line[2] == '\0' || line[2] == ' '))
- return cb_err;
+ break;
else if (linelen >= 4
&& line[0] == 'E' && line[1] == 'R' && line[2] == 'R'
&& line[3] == ' ')
@@ -610,6 +610,7 @@ gpgsm_assuan_simple_command (engine_gpgsm_t gpgsm, const char *cmd,
more related to gpgme and thus probably more important
than the error returned by the engine. */
err = cb_err? cb_err : atoi (&line[4]);
+ cb_err = 0;
}
else if (linelen >= 2
&& line[0] == 'S' && line[1] == ' ')
@@ -646,10 +647,16 @@ gpgsm_assuan_simple_command (engine_gpgsm_t gpgsm, const char *cmd,
to stop. As with ERR we prefer a status callback
generated error code, though. */
err = cb_err ? cb_err : gpg_error (GPG_ERR_GENERAL);
+ cb_err = 0;
}
}
while (!err);
+ /* We only want the first error from the status handler, thus we
+ * take the one saved in CB_ERR. */
+ if (!err && cb_err)
+ err = cb_err;
+
return err;
}
@@ -1120,12 +1127,16 @@ gpgsm_reset (void *engine)
static gpgme_error_t
-gpgsm_decrypt (void *engine, gpgme_data_t ciph, gpgme_data_t plain,
+gpgsm_decrypt (void *engine,
+ gpgme_decrypt_flags_t flags,
+ gpgme_data_t ciph, gpgme_data_t plain,
int export_session_key, const char *override_session_key)
{
engine_gpgsm_t gpgsm = engine;
gpgme_error_t err;
+ (void)flags;
+
/* gpgsm is not capable of exporting session keys right now, so we
* will ignore this if requested. */
(void)export_session_key;
@@ -1642,10 +1653,10 @@ gpgsm_keylist (void *engine, const char *pattern, int secret_only,
gpgsm_assuan_simple_command (gpgsm, "GETINFO agent-check", NULL, NULL);
/* Always send list-mode option because RESET does not reset it. */
- if (asprintf (&line, "OPTION list-mode=%d", (list_mode & 3)) < 0)
+ if (gpgrt_asprintf (&line, "OPTION list-mode=%d", (list_mode & 3)) < 0)
return gpg_error_from_syserror ();
err = gpgsm_assuan_simple_command (gpgsm, line, NULL, NULL);
- free (line);
+ gpgrt_free (line);
if (err)
return err;
@@ -1726,10 +1737,10 @@ gpgsm_keylist_ext (void *engine, const char *pattern[], int secret_only,
list_mode |= 2;
/* Always send list-mode option because RESET does not reset it. */
- if (asprintf (&line, "OPTION list-mode=%d", (list_mode & 3)) < 0)
+ if (gpgrt_asprintf (&line, "OPTION list-mode=%d", (list_mode & 3)) < 0)
return gpg_error_from_syserror ();
err = gpgsm_assuan_simple_command (gpgsm, line, NULL, NULL);
- free (line);
+ gpgrt_free (line);
if (err)
return err;
@@ -1860,10 +1871,11 @@ gpgsm_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
can reset any previously set value in case the default is
requested. */
- if (asprintf (&assuan_cmd, "OPTION include-certs %i", include_certs) < 0)
+ if (gpgrt_asprintf (&assuan_cmd,
+ "OPTION include-certs %i", include_certs) < 0)
return gpg_error_from_syserror ();
err = gpgsm_assuan_simple_command (gpgsm, assuan_cmd, NULL, NULL);
- free (assuan_cmd);
+ gpgrt_free (assuan_cmd);
if (err)
return err;
}
@@ -2048,7 +2060,7 @@ gpgsm_passwd (void *engine, gpgme_key_t key, unsigned int flags)
if (!key || !key->subkeys || !key->subkeys->fpr)
return gpg_error (GPG_ERR_INV_CERT_OBJ);
- if (asprintf (&line, "PASSWD -- %s", key->subkeys->fpr) < 0)
+ if (gpgrt_asprintf (&line, "PASSWD -- %s", key->subkeys->fpr) < 0)
return gpg_error_from_syserror ();
gpgsm_clear_fd (gpgsm, OUTPUT_FD);
@@ -2057,7 +2069,7 @@ gpgsm_passwd (void *engine, gpgme_key_t key, unsigned int flags)
gpgsm->inline_data = NULL;
err = start (gpgsm, line);
- free (line);
+ gpgrt_free (line);
return err;
}
@@ -2087,7 +2099,6 @@ struct engine_ops _gpgme_engine_ops_gpgsm =
gpgsm_set_locale,
NULL, /* set_protocol */
gpgsm_decrypt,
- gpgsm_decrypt,
gpgsm_delete, /* decrypt_verify */
NULL, /* edit */
gpgsm_encrypt,
@@ -2098,6 +2109,7 @@ struct engine_ops _gpgme_engine_ops_gpgsm =
gpgsm_import,
gpgsm_keylist,
gpgsm_keylist_ext,
+ NULL, /* keylist_data */
NULL, /* keysign */
NULL, /* tofu_policy */
gpgsm_sign,