summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2022-05-25 16:33:33 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2022-05-25 16:33:33 +0900
commit2a5550b7a13ce627ed0e40ab9582478ab5c9b809 (patch)
tree44014b87535ed91e0eb6c554572acc51eb4b816f
parentaafbde956f88d0e618b661f86041679bf8c5850a (diff)
downloadlibassuan-2a5550b7a13ce627ed0e40ab9582478ab5c9b809.tar.gz
client: Handle inquiry from server with CONFIDENTIAL.
* src/assuan-defs.h (struct assuan_context_s): Add new flags, in_inq_cb and confidential_inquiry. * src/client.c (assuan_transact): Use the new flags to wipe the outbound buffer for inquiry when CONFIDENTIAL. * src/context.c (assuan_set_flag): When ASSUAN_CONFIDENTIAL is set in inquire callback, set the confidential_inquiry flag. -- GnuPG-bug-id: 5977 Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
-rw-r--r--src/assuan-defs.h6
-rw-r--r--src/client.c10
-rw-r--r--src/context.c2
3 files changed, 16 insertions, 2 deletions
diff --git a/src/assuan-defs.h b/src/assuan-defs.h
index b9a0e8b..37a50af 100644
--- a/src/assuan-defs.h
+++ b/src/assuan-defs.h
@@ -98,11 +98,13 @@ struct assuan_context_s
unsigned int force_close : 1;
/* From here, we have internal flags, not defined by assuan_flag_t. */
unsigned int is_socket : 1;
- unsigned int is_server : 1; /* Set if this is context belongs to a server */
- unsigned int in_inquire : 1;
+ unsigned int is_server : 1; /* Set if this is context belongs to a server */
+ unsigned int in_inquire : 1; /* Server: inside assuan_inquire */
unsigned int in_process_next : 1;
unsigned int process_complete : 1;
unsigned int in_command : 1;
+ unsigned int in_inq_cb : 1; /* Client: inquire callback is active */
+ unsigned int confidential_inquiry : 1; /* Client: inquiry is confidential */
} flags;
/* If set, this is called right before logging an I/O line. */
diff --git a/src/client.c b/src/client.c
index 24bf396..e0759f6 100644
--- a/src/client.c
+++ b/src/client.c
@@ -291,6 +291,9 @@ assuan_transact (assuan_context_t ctx,
}
else
{
+ ctx->flags.confidential_inquiry = 0;
+ ctx->flags.in_inq_cb = 1;
+
rc = inquire_cb (inquire_cb_arg, line);
if (!rc)
rc = assuan_send_data (ctx, NULL, 0); /* flush and send END */
@@ -303,6 +306,13 @@ assuan_transact (assuan_context_t ctx,
assuan_send_data (ctx, NULL, 1);
_assuan_read_from_server (ctx, &response, &off, 0);
}
+
+ if (ctx->flags.confidential_inquiry)
+ wipememory (ctx->outbound.data.line, LINELENGTH);
+
+ ctx->flags.confidential_inquiry = 0;
+ ctx->flags.in_inq_cb = 0;
+
if (!rc)
goto again;
}
diff --git a/src/context.c b/src/context.c
index 82166bb..dd89de9 100644
--- a/src/context.c
+++ b/src/context.c
@@ -76,6 +76,8 @@ assuan_set_flag (assuan_context_t ctx, assuan_flag_t flag, int value)
case ASSUAN_CONFIDENTIAL:
ctx->flags.confidential = value;
+ if (ctx->flags.in_inq_cb && value)
+ ctx->flags.confidential_inquiry = value;
break;
case ASSUAN_NO_FIXSIGNALS: