Skip to content

Commit

Permalink
qio: non-default context for TLS handshake
Browse files Browse the repository at this point in the history
A new parameter "context" is added to qio_channel_tls_handshake() is to
allow the TLS to be run on a non-default context.  Still, no functional
change.

Signed-off-by: Peter Xu <[email protected]>
Signed-off-by: Daniel P. Berrangé <[email protected]>
  • Loading branch information
xzpeter authored and berrange committed Mar 6, 2018
1 parent 8005fdd commit 1939ccd
Show file tree
Hide file tree
Showing 9 changed files with 47 additions and 12 deletions.
1 change: 1 addition & 0 deletions chardev/char-socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,7 @@ static void tcp_chr_tls_init(Chardev *chr)
qio_channel_tls_handshake(tioc,
tcp_chr_tls_handshake,
chr,
NULL,
NULL);
}

Expand Down
5 changes: 4 additions & 1 deletion include/io/channel-tls.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,8 @@ qio_channel_tls_new_client(QIOChannel *master,
* @func: the callback to invoke when completed
* @opaque: opaque data to pass to @func
* @destroy: optional callback to free @opaque
* @context: the context that TLS handshake will run with. If %NULL,
* the default context will be used
*
* Perform the TLS session handshake. This method
* will return immediately and the handshake will
Expand All @@ -126,7 +128,8 @@ qio_channel_tls_new_client(QIOChannel *master,
void qio_channel_tls_handshake(QIOChannelTLS *ioc,
QIOTaskFunc func,
gpointer opaque,
GDestroyNotify destroy);
GDestroyNotify destroy,
GMainContext *context);

/**
* qio_channel_tls_get_session:
Expand Down
45 changes: 34 additions & 11 deletions io/channel-tls.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,13 +140,19 @@ qio_channel_tls_new_client(QIOChannel *master,
return NULL;
}

struct QIOChannelTLSData {
QIOTask *task;
GMainContext *context;
};
typedef struct QIOChannelTLSData QIOChannelTLSData;

static gboolean qio_channel_tls_handshake_io(QIOChannel *ioc,
GIOCondition condition,
gpointer user_data);

static void qio_channel_tls_handshake_task(QIOChannelTLS *ioc,
QIOTask *task)
QIOTask *task,
GMainContext *context)
{
Error *err = NULL;
QCryptoTLSSessionHandshakeStatus status;
Expand All @@ -171,18 +177,28 @@ static void qio_channel_tls_handshake_task(QIOChannelTLS *ioc,
qio_task_complete(task);
} else {
GIOCondition condition;
QIOChannelTLSData *data = g_new0(typeof(*data), 1);

data->task = task;
data->context = context;

if (context) {
g_main_context_ref(context);
}

if (status == QCRYPTO_TLS_HANDSHAKE_SENDING) {
condition = G_IO_OUT;
} else {
condition = G_IO_IN;
}

trace_qio_channel_tls_handshake_pending(ioc, status);
qio_channel_add_watch(ioc->master,
condition,
qio_channel_tls_handshake_io,
task,
NULL);
qio_channel_add_watch_full(ioc->master,
condition,
qio_channel_tls_handshake_io,
data,
NULL,
context);
}
}

Expand All @@ -191,28 +207,35 @@ static gboolean qio_channel_tls_handshake_io(QIOChannel *ioc,
GIOCondition condition,
gpointer user_data)
{
QIOTask *task = user_data;
QIOChannelTLSData *data = user_data;
QIOTask *task = data->task;
GMainContext *context = data->context;
QIOChannelTLS *tioc = QIO_CHANNEL_TLS(
qio_task_get_source(task));

qio_channel_tls_handshake_task(
tioc, task);
g_free(data);
qio_channel_tls_handshake_task(tioc, task, context);

if (context) {
g_main_context_unref(context);
}

return FALSE;
}

void qio_channel_tls_handshake(QIOChannelTLS *ioc,
QIOTaskFunc func,
gpointer opaque,
GDestroyNotify destroy)
GDestroyNotify destroy,
GMainContext *context)
{
QIOTask *task;

task = qio_task_new(OBJECT(ioc),
func, opaque, destroy);

trace_qio_channel_tls_handshake_start(ioc);
qio_channel_tls_handshake_task(ioc, task);
qio_channel_tls_handshake_task(ioc, task, context);
}


Expand Down
2 changes: 2 additions & 0 deletions migration/tls.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ void migration_tls_channel_process_incoming(MigrationState *s,
qio_channel_tls_handshake(tioc,
migration_tls_incoming_handshake,
NULL,
NULL,
NULL);
}

Expand Down Expand Up @@ -159,5 +160,6 @@ void migration_tls_channel_connect(MigrationState *s,
qio_channel_tls_handshake(tioc,
migration_tls_outgoing_handshake,
s,
NULL,
NULL);
}
1 change: 1 addition & 0 deletions nbd/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -579,6 +579,7 @@ static QIOChannel *nbd_receive_starttls(QIOChannel *ioc,
qio_channel_tls_handshake(tioc,
nbd_tls_handshake,
&data,
NULL,
NULL);

if (!data.complete) {
Expand Down
1 change: 1 addition & 0 deletions nbd/server.c
Original file line number Diff line number Diff line change
Expand Up @@ -599,6 +599,7 @@ static QIOChannel *nbd_negotiate_handle_starttls(NBDClient *client,
qio_channel_tls_handshake(tioc,
nbd_tls_handshake,
&data,
NULL,
NULL);

if (!data.complete) {
Expand Down
2 changes: 2 additions & 0 deletions tests/test-io-channel-tls.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,10 +203,12 @@ static void test_io_channel_tls(const void *opaque)
qio_channel_tls_handshake(clientChanTLS,
test_tls_handshake_done,
&clientHandshake,
NULL,
NULL);
qio_channel_tls_handshake(serverChanTLS,
test_tls_handshake_done,
&serverHandshake,
NULL,
NULL);

/*
Expand Down
1 change: 1 addition & 0 deletions ui/vnc-auth-vencrypt.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ static int protocol_client_vencrypt_auth(VncState *vs, uint8_t *data, size_t len
qio_channel_tls_handshake(tls,
vnc_tls_handshake_done,
vs,
NULL,
NULL);
}
return 0;
Expand Down
1 change: 1 addition & 0 deletions ui/vnc-ws.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ gboolean vncws_tls_handshake_io(QIOChannel *ioc G_GNUC_UNUSED,
qio_channel_tls_handshake(tls,
vncws_tls_handshake_done,
vs,
NULL,
NULL);

return TRUE;
Expand Down

0 comments on commit 1939ccd

Please sign in to comment.