diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2022-05-25 16:33:33 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2022-05-25 16:33:33 +0900 |
commit | 2a5550b7a13ce627ed0e40ab9582478ab5c9b809 (patch) | |
tree | 44014b87535ed91e0eb6c554572acc51eb4b816f | |
parent | aafbde956f88d0e618b661f86041679bf8c5850a (diff) | |
download | libassuan-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.h | 6 | ||||
-rw-r--r-- | src/client.c | 10 | ||||
-rw-r--r-- | src/context.c | 2 |
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: |