Re: [PATCH] Avoid passing libusb functions as callbacks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,
On Fri, 2018-08-17 at 15:24 +0200, Victor Toso wrote:
> Hi,
> 
> On Fri, Aug 17, 2018 at 03:12:35PM +0200, jorge.olmos@xxxxxxxxxxx
> wrote:
> > From: Jorge Olmos <jorge.olmos@xxxxxxxxxxx>
> > 
> > When building spice-gtk for windows:
> > - libusb uses __stdcall calling convention when compiled for win32.
> > It does
> > not include an option to be compiled with __cdecl calling
> > convention.
> > Directly calling libusb functions works fine. But it is a problem
> > when its
> > functions are passed as callbacks to a function that expects other
> > calling
> > convention.
> > - glib uses __cdecl calling convention and expects the functions it
> > receives as parameters to follow __cdecl convention.
> > 
> > So the lines included in spice-gtk like:
> >      g_clear_pointer(&priv->device, libusb_unref_device);
> > cause libusb_unref_device (compiled with _stdcall convention) to be
> > called
> > with __cdecl convention. This causes stack corruption, and hence
> > crashes.
> 
> Have you raised a bug in glib? We use this libraries to help with
> portability so I'd hope it is possible to fix in glib.
> 

I don't think it is even possible to fix this cleanly in glib. A
compilation of glib can work well with __stdcall OR with __cdecl. But
not with both of them.

Right now I have just found another patch in spice-gtk, where the same
problem was solved with the same solution, which also has no
portability issues:

https://patchwork.freedesktop.org/patch/92705/



> > ---
> >  src/channel-usbredir.c | 9 ++++++---
> >  1 file changed, 6 insertions(+), 3 deletions(-)
> > 
> > diff --git a/src/channel-usbredir.c b/src/channel-usbredir.c
> > index 6ffe546..1d9c380 100644
> > --- a/src/channel-usbredir.c
> > +++ b/src/channel-usbredir.c
> > @@ -352,7 +352,8 @@ static void spice_usbredir_channel_open_acl_cb(
> >          spice_usbredir_channel_open_device(channel, &err);
> >      }
> >      if (err) {
> > -        g_clear_pointer(&priv->device, libusb_unref_device);
> > +        libusb_unref_device(priv->device);
> > +        priv->device = NULL;
> >          g_boxed_free(spice_usb_device_get_type(), priv-
> > >spice_device);
> >          priv->spice_device = NULL;
> >          priv->state  = STATE_DISCONNECTED;
> > @@ -383,7 +384,8 @@ _open_device_async_cb(GTask *task,
> >      spice_usbredir_channel_lock(channel);
> >  
> >      if (!spice_usbredir_channel_open_device(channel, &err)) {
> > -        g_clear_pointer(&priv->device, libusb_unref_device);
> > +        libusb_unref_device(priv->device);
> > +        priv->device = NULL;
> >          g_boxed_free(spice_usb_device_get_type(), priv-
> > >spice_device);
> >          priv->spice_device = NULL;
> >      }
> > @@ -504,7 +506,8 @@ void
> > spice_usbredir_channel_disconnect_device(SpiceUsbredirChannel
> > *channel)
> >  
> >          /* This also closes the libusb handle we passed from
> > open_device */
> >          usbredirhost_set_device(priv->host, NULL);
> > -        g_clear_pointer(&priv->device, libusb_unref_device);
> > +        libusb_unref_device(priv->device);
> > +        priv->device = NULL;
> >          g_boxed_free(spice_usb_device_get_type(), priv-
> > >spice_device);
> >          priv->spice_device = NULL;
> >          priv->state  = STATE_DISCONNECTED;
> > -- 
> > 2.14.4
> > 
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel@xxxxxxxxxxxxxxxxxxxxx
> > https://lists.freedesktop.org/mailman/listinfo/spice-devel
> 
> 
-- 


Jorge Olmos
Software Engineer
jorge.olmos@xxxxxxxxxxx
+34 876 60 00 73
Legal Information and Privacy Policy
Política de confidencialidad
Este mensaje y los ficheros anexos son confidenciales dirigiéndose exclusivamente al destinatario mencionado en el encabezamiento. Si usted ha recibido este correo por error, tenga la amabilidad de eliminarlo de su sistema y no divulgar el contenido a terceros. Los datos personales facilitados por usted o por terceros serán tratados por FLEXIBLE SOFTWARE SOLUTIONS S.L.U. con la finalidad de gestionar y mantener los contactos y relaciones que se produzcan como consecuencia de la relación que mantiene con FLEXIBLE SOFTWARE SOLUTIONS S.L.U. Normalmente, la base jurídica que legitima este tratamiento, será su consentimiento, el interés legítimo o la necesidad para gestionar una relación contractual o similar. El plazo de conservación de sus datos vendrá determinado por la relación que mantiene con nosotros. Para más información al respecto, o para ejercer sus derechos de acceso, rectificación, supresión, oposición, limitación o portabilidad, dirija una comunicación por escrito a FLEXIBLE SOFTWARE SOLUTIONS S.L.U: Avenida de Ranillas 1D, Planta 3, Oficina 3G, Zaragoza o al correo electrónico dpo@xxxxxxxxxxx. En caso de considerar vulnerado su derecho a la protección de datos personales, podrá interponer una reclamación ante la Agencia Española de Protección de Datos (www.agpd.es).
 
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux Virtualization]     [Linux Virtualization]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]