[libvirt] [PATCH] remote: Fix TLS transport on Windows

Daniel P. Berrange berrange at redhat.com
Tue Nov 23 10:13:11 UTC 2010


On Mon, Nov 22, 2010 at 10:50:14PM +0100, Matthias Bolte wrote:
> 2010/11/22 Eric Blake <eblake at redhat.com>:
> > On 11/22/2010 01:42 PM, Matthias Bolte wrote:
> >>>> This doesn't entirely make any sense to me. GNUTLS also uses GNULIB,
> >>>> including all its socket wrappers for send/recv. If the push/pull
> >>>> function is NULL, gnulib does this
> >>>>
> >>>>      if (session->internals._gnutls_push_func == NULL)
> >>>>        {
> >>>>          i = send (GNUTLS_POINTER_TO_INT (fd), &ptr[n - left], left, 0);
> >>>>
> >>
> >> Okay, yes GnuTLS uses gnulib, but they explicitly don't use gnulib's
> >> replacements for send() and recv() on Windows. See
> >> lib/gnutls_buffers.c:
> >>
> >> /* We need to disable gnulib's replacement wrappers to get native
> >>    Windows interfaces. */
> >> #undef recv
> >> #undef send
> >>
> >> GnuTLS decided to use the native Windows versions of send() and
> >> recv(). This cannot be changed, as that would break existing
> >> applications using GnuTLS on Windows relying on GnuTLS using the
> >> native Windows versions of send() and recv(). Therefore, I think my
> >> patch is necessary, as libvirt requires GnuTLS to use gnulib's
> >> replacement functions.
> >
> > Makes sense to me.  However, why the double cast?
> >
> > +#if HAVE_WINSOCK2_H
> > +static ssize_t
> > +custom_gnutls_push(void *s, const void *buf, size_t len)
> > +{
> > +    return send((int)(long)s, buf, len, 0);
> > +}
> > +
> > +static ssize_t
> > +custom_gnutls_pull(void *s, void *buf, size_t len)
> > +{
> > +    return recv((int)(long)s, buf, len, 0);
> > +}
> > +#endif
> >
> > Wouldn't send((size_t)s, ...) be better than send((int)(long)s,...)?
> >
> 
> I just used what'a in curl, as directly casting from void* to int
> would give this error on 64bit platform:
> 
>   error: cast from pointer to integer of different size [-Wpointer-to-int-cast]
> 
> (Yes, this is tested on Linux 64bit, as I didn't setup mingw-w64 yet)
> 
> Casting to size_t works too.
> 
> Here's a v2 that casts to size_t and has an improved commit message.

ACK, that makes sense now.






More information about the libvir-list mailing list