summaryrefslogtreecommitdiff
path: root/security/opensc/patches/patch-ac
diff options
context:
space:
mode:
Diffstat (limited to 'security/opensc/patches/patch-ac')
-rw-r--r--security/opensc/patches/patch-ac99
1 files changed, 99 insertions, 0 deletions
diff --git a/security/opensc/patches/patch-ac b/security/opensc/patches/patch-ac
new file mode 100644
index 00000000000..aa155db89aa
--- /dev/null
+++ b/security/opensc/patches/patch-ac
@@ -0,0 +1,99 @@
+$NetBSD: patch-ac,v 1.1 2010/09/01 15:59:23 drochner Exp $
+
+--- src/signer/dialog.c.orig 2010-02-16 09:03:25.000000000 +0000
++++ src/signer/dialog.c
+@@ -15,31 +15,31 @@ struct entry_parm_s {
+ char *buffer;
+ };
+
+-static AssuanError
++static gpg_error_t
+ getpin_cb (void *opaque, const void *buffer, size_t length)
+ {
+ struct entry_parm_s *parm = (struct entry_parm_s *) opaque;
+
+ /* we expect the pin to fit on one line */
+ if (parm->lines || length >= parm->size)
+- return ASSUAN_Too_Much_Data;
++ return gpg_error(GPG_ERR_ASS_TOO_MUCH_DATA);
+
+ /* fixme: we should make sure that the assuan buffer is allocated in
+ secure memory or read the response byte by byte */
+ memcpy(parm->buffer, buffer, length);
+ parm->buffer[length] = 0;
+ parm->lines++;
+- return (AssuanError) 0;
++ return gpg_error(GPG_ERR_NO_ERROR);
+ }
+
+ int ask_and_verify_pin_code(struct sc_pkcs15_card *p15card,
+ struct sc_pkcs15_object *pin)
+ {
+- int r;
++ gpg_error_t r;
+ size_t len;
+ const char *argv[3];
+ const char *pgmname = PIN_ENTRY;
+- ASSUAN_CONTEXT ctx;
++ assuan_context_t ctx = NULL;
+ char buf[500];
+ char errtext[100];
+ struct entry_parm_s parm;
+@@ -48,16 +48,26 @@ int ask_and_verify_pin_code(struct sc_pk
+ argv[0] = pgmname;
+ argv[1] = NULL;
+
+- r = assuan_pipe_connect(&ctx, pgmname, (char **) argv, NULL);
++ assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
++
++ r = assuan_new(&ctx);
++ if (r) {
++ printf("Can't initialize assuan context: %s\n)",
++ gpg_strerror(r));
++ goto err;
++ }
++
++ r = assuan_pipe_connect(ctx, pgmname, (const char **) argv, \
++ NULL, NULL, NULL, 0);
+ if (r) {
+ printf("Can't connect to the PIN entry module: %s\n",
+- assuan_strerror((AssuanError) r));
++ gpg_strerror(r));
+ goto err;
+ }
+ sprintf(buf, "SETDESC Enter PIN [%s] for digital signing ", pin->label);
+ r = assuan_transact(ctx, buf, NULL, NULL, NULL, NULL, NULL, NULL);
+ if (r) {
+- printf("SETDESC: %s\n", assuan_strerror((AssuanError) r));
++ printf("SETDESC: %s\n", gpg_strerror(r));
+ goto err;
+ }
+ errtext[0] = 0;
+@@ -71,12 +81,12 @@ int ask_and_verify_pin_code(struct sc_pk
+ parm.size = sizeof(buf);
+ parm.buffer = buf;
+ r = assuan_transact(ctx, "GETPIN", getpin_cb, &parm, NULL, NULL, NULL, NULL);
+- if (r == ASSUAN_Canceled) {
+- assuan_disconnect(ctx);
++ if (gpg_err_code(r) == GPG_ERR_ASS_CANCELED) {
++ assuan_release(ctx);
+ return -2;
+ }
+ if (r) {
+- printf("GETPIN: %s\n", assuan_strerror((AssuanError) r));
++ printf("GETPIN: %s\n", gpg_strerror(r));
+ goto err;
+ }
+ len = strlen(buf);
+@@ -104,9 +114,9 @@ int ask_and_verify_pin_code(struct sc_pk
+ break;
+ }
+
+- assuan_disconnect(ctx);
++ assuan_release(ctx);
+ return 0;
+ err:
+- assuan_disconnect(ctx);
++ assuan_release(ctx);
+ return -1;
+ }