diff options
Diffstat (limited to 'libevent/buffer.c')
| -rw-r--r-- | libevent/buffer.c | 22 | 
1 files changed, 13 insertions, 9 deletions
| diff --git a/libevent/buffer.c b/libevent/buffer.c index 77efd0cfa3e20..0327eb549383c 100644 --- a/libevent/buffer.c +++ b/libevent/buffer.c @@ -44,6 +44,7 @@  #include <sys/ioctl.h>  #endif +#include <assert.h>  #include <errno.h>  #include <stdio.h>  #include <stdlib.h> @@ -106,7 +107,7 @@ evbuffer_add_buffer(struct evbuffer *outbuf, struct evbuffer *inbuf)  		/*   		 * Optimization comes with a price; we need to notify the  		 * buffer if necessary of the changes. oldoff is the amount -		 * of data that we tranfered from inbuf to outbuf +		 * of data that we transfered from inbuf to outbuf  		 */  		if (inbuf->off != oldoff && inbuf->cb != NULL)  			(*inbuf->cb)(inbuf, oldoff, inbuf->off, inbuf->cbarg); @@ -134,9 +135,13 @@ evbuffer_add_vprintf(struct evbuffer *buf, const char *fmt, va_list ap)  	int sz;  	va_list aq; +	/* make sure that at least some space is available */ +	evbuffer_expand(buf, 64);  	for (;;) { +		size_t used = buf->misalign + buf->off;  		buffer = (char *)buf->buffer + buf->off; -		space = buf->totallen - buf->misalign - buf->off; +		assert(buf->totallen >= used); +		space = buf->totallen - used;  #ifndef va_copy  #define	va_copy(dst, src)	memcpy(&(dst), &(src), sizeof(va_list)) @@ -152,7 +157,7 @@ evbuffer_add_vprintf(struct evbuffer *buf, const char *fmt, va_list ap)  		va_end(aq); -		if (sz == -1) +		if (sz < 0)  			return (-1);  		if (sz < space) {  			buf->off += sz; @@ -244,7 +249,7 @@ evbuffer_readline(struct evbuffer *buffer)  /* Adds data to an event buffer */ -static inline void +static void  evbuffer_align(struct evbuffer *buf)  {  	memmove(buf->orig_buffer, buf->buffer, buf->off); @@ -431,13 +436,12 @@ evbuffer_write(struct evbuffer *buffer, int fd)  u_char *  evbuffer_find(struct evbuffer *buffer, const u_char *what, size_t len)  { -	size_t remain = buffer->off; -	u_char *search = buffer->buffer; +	u_char *search = buffer->buffer, *end = search + buffer->off;  	u_char *p; -	while ((p = memchr(search, *what, remain)) != NULL) { -		remain = buffer->off - (size_t)(search - buffer->buffer); -		if (remain < len) +	while (search < end && +	    (p = memchr(search, *what, end - search)) != NULL) { +		if (p + len > end)  			break;  		if (memcmp(p, what, len) == 0)  			return (p); | 
