On Thu, Mar 01, 2018 at 03:50:01PM +0000, Daniel P. Berrangé wrote: > On Thu, Mar 01, 2018 at 04:44:34PM +0800, Peter Xu wrote: > > qio_channel_tls_handshake_full() is introduced to allow the TLS to be > > run on a non-default context. Still, no functional change. > > > > Signed-off-by: Peter Xu <pet...@redhat.com> > > --- > > include/io/channel-tls.h | 17 ++++++++++++++++ > > io/channel-tls.c | 51 > > +++++++++++++++++++++++++++++++++++------------- > > 2 files changed, 54 insertions(+), 14 deletions(-) > > > > > static void qio_channel_tls_handshake_task(QIOChannelTLS *ioc, > > - QIOTask *task) > > + QIOTask *task, > > + GMainContext *context) > > { > > Error *err = NULL; > > QCryptoTLSSessionHandshakeStatus status; > > @@ -171,6 +177,11 @@ 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; > > The 'context' reference is only valid for as long as the caller > exists. So you need to acquire a reference on 'context' here.... > > > > @@ -191,20 +203,23 @@ 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); > > And release the reference on context here.
Yeah, fixed both. Thanks, -- Peter Xu