[Libevent-users] evbuffer issues on GNU/Linux amd64

Niels Provos provos at citi.umich.edu
Thu Nov 9 21:17:16 EST 2006


I submitted a fix along these lines to subversion.  Please, check it
out and see if you can reproduce problems on amd64.  I don't have
access to such a system.

Thank you,
Niels.

On 10/27/06, Alejo Sanchez <alejos at gmail.com> wrote:
> Hi Niels, list.
>
> I'm using libevent on a Gentoo GNU/Linux on amd64. The regression test
> for Evbuffer  segfaulted and checking the code evbuffer_add_vprintf()
> does multiple calls always to a va_list (as the evbuffer is created
> without a buffer and there's a try t o vsprintf() to a null one)
> According to this guy
> http://lists.freebsd.org/pipermail/freebsd-amd64/2005-February/003630.html
> you can only do a call to a va_list and you have to reinitialize it afterwards.
>
> So I guess there should be a va_list and a call to va_copy inside
> evbuffer_add_vprintf()
>
> The patch below works but not sure if it's the best way to do it.
>
> Have a nice weekend :)
>
> Alejo
>
>
> --- buffer.c.ori        2006-10-27 17:22:18.000000000 +0100
> +++ buffer.c    2006-10-27 17:27:08.000000000 +0100
> @@ -132,17 +132,23 @@
>         size_t space;
>         size_t oldoff = buf->off;
>         int sz;
> +       va_list aq;
>
>         for (;;) {
>                 buffer = buf->buffer + buf->off;
>                 space = buf->totallen - buf->misalign - buf->off;
>
> +               va_copy(aq, ap);
> +
>  #ifdef WIN32
> -               sz = vsnprintf(buffer, space - 1, fmt, ap);
> +               sz = vsnprintf(buffer, space - 1, fmt, aq);
>                 buffer[space - 1] = '\0';
>  #else
> -               sz = vsnprintf(buffer, space, fmt, ap);
> +               sz = vsnprintf(buffer, space, fmt, aq);
>  #endif
> +
> +               va_end(aq);
> +
>                 if (sz == -1)
>                         return (-1);
>                 if (sz < space) {
>
>
>
>
>
> int
> evbuffer_add_vprintf(struct evbuffer *buf, const char *fmt, va_list ap)
> {
>         char *buffer;
>         size_t space;
>         size_t oldoff = buf->off;
>         int sz;
>
>         for (;;) {
>                 buffer = buf->buffer + buf->off;
>                 space = buf->totallen - buf->misalign - buf->off;
>
> #ifdef WIN32
>                 sz = vsnprintf(buffer, space - 1, fmt, ap);
>                 buffer[space - 1] = '\0';
> #else
>                 sz = vsnprintf(buffer, space, fmt, ap);
> #endif
>                 if (sz == -1)
>                         return (-1);
>                 if (sz < space) {
>                         buf->off += sz;
>                         if (buf->cb != NULL)
>                                 (*buf->cb)(buf, oldoff, buf->off, buf->cbarg);
>                         return (sz);
>                 }
>                 if (evbuffer_expand(buf, sz + 1) == -1)
>                         return (-1);
>
>         }
>         /* NOTREACHED */
> }
> _______________________________________________
> Libevent-users mailing list
> Libevent-users at monkey.org
> http://monkey.org/mailman/listinfo/libevent-users
>
>


More information about the Libevent-users mailing list