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
[email protected]
http://monkey.org/mailman/listinfo/libevent-users