Ack On Wed, 2016-11-02 at 16:25 -0500, Jonathon Jongsma wrote: > Commit 542bc478 removed the global smartcard channel, but never > stored the > newly-created channel anywhere. To avoid leaking the channel, store > the channel > as a private member of the device it is associated with. It will be > unreffed > when its associated device is destroyed. > --- > server/smartcard.c | 15 +++++++++------ > 1 file changed, 9 insertions(+), 6 deletions(-) > > diff --git a/server/smartcard.c b/server/smartcard.c > index 5b18abe..bc1ada4 100644 > --- a/server/smartcard.c > +++ b/server/smartcard.c > @@ -115,6 +115,7 @@ struct RedCharDeviceSmartcardPrivate { > > SmartCardChannelClient *scc; // client providing the remote > card > int reader_added; // has reader_add been sent > to the device > + RedSmartcardChannel *channel; > }; > > typedef struct RedMsgItem { > @@ -136,7 +137,6 @@ static int > smartcard_char_device_add_to_readers(RedsState *reds, > SpiceCharDevice > static RedMsgItem *smartcard_char_device_on_message_from_device( > RedCharDeviceSmartcard *dev, VSCMsgHeader *header); > static RedCharDeviceSmartcard *smartcard_device_new(RedsState > *reds, SpiceCharDeviceInstance *sin); > -static void smartcard_init(RedsState *reds); > > static void smartcard_read_buf_prepare(RedCharDeviceSmartcard *dev, > VSCMsgHeader *vheader) > { > @@ -256,7 +256,7 @@ static int > smartcard_char_device_add_to_readers(RedsState *reds, > SpiceCharDevice > } > dev->priv->reader_id = g_smartcard_readers.num; > g_smartcard_readers.sin[g_smartcard_readers.num++] = > char_device; > - smartcard_init(reds); > + dev->priv->channel = red_smartcard_channel_new(reds); > return 0; > } > > @@ -602,13 +602,15 @@ > red_smartcard_channel_class_init(RedSmartcardChannelClass *klass) > > } > > -static void smartcard_init(RedsState *reds) > +static void > +red_char_device_smartcard_dispose(GObject *object) > { > - spice_assert(!reds_find_channel(reds, SPICE_CHANNEL_SMARTCARD, > 0)); > + RedCharDeviceSmartcard *self = > RED_CHAR_DEVICE_SMARTCARD(object); > > - red_smartcard_channel_new(reds); > -} > + g_clear_object(&self->priv->channel); > > + G_OBJECT_CLASS(red_char_device_smartcard_parent_class)- > >dispose(object); > +} > > static void > red_char_device_smartcard_finalize(GObject *object) > @@ -628,6 +630,7 @@ > red_char_device_smartcard_class_init(RedCharDeviceSmartcardClass > *klass) > > g_type_class_add_private(klass, sizeof > (RedCharDeviceSmartcardPrivate)); > > + object_class->dispose = red_char_device_smartcard_dispose; > object_class->finalize = red_char_device_smartcard_finalize; > > char_dev_class->read_one_msg_from_device = > smartcard_read_msg_from_device; _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel