From: Wilfried Goesgens Date: Mon, 27 Dec 2010 15:39:16 +0000 (+0100) Subject: Libevent Migration X-Git-Tag: v8.11~1136 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=6ae6c71b048ef1af433a5f9d8fd0cac8be680959 Libevent Migration - change the place where we check the space for the \0 for reading - we didn't check the case to increase the buffer while reading if the reading algorithm didn't find a complete line yet... --- diff --git a/libcitadel/lib/stringbuf.c b/libcitadel/lib/stringbuf.c index dfba39d7e..88ce0679c 100644 --- a/libcitadel/lib/stringbuf.c +++ b/libcitadel/lib/stringbuf.c @@ -3402,18 +3402,27 @@ long StrBuf_read_one_chunk_callback (int fd, short event, IOBuffer *FB) { long bufremain = 0; int n; + + if ((FB == NULL) || (FB->Buf == NULL)) + return -1; /* * check whether the read pointer is somewhere in a range * where a cut left is inexpensive */ + if (FB->ReadWritePointer != NULL) { - long already_read = FB->ReadWritePointer - FB->Buf->buf; - bufremain = FB->Buf->BufSize - FB->Buf->BufUsed; + long already_read; + + already_read = FB->ReadWritePointer - FB->Buf->buf; + bufremain = FB->Buf->BufSize - FB->Buf->BufUsed - 1; if (already_read != 0) { - long unread = FB->Buf->BufUsed - already_read; + long unread; + + unread = FB->Buf->BufUsed - already_read; + /* else nothing to compact... */ if (unread == 0) { FB->ReadWritePointer = FB->Buf->buf; @@ -3432,22 +3441,35 @@ long StrBuf_read_one_chunk_callback (int fd, short event, IOBuffer *FB) else memmove(FB->Buf->buf, FB->ReadWritePointer, unread); FB->ReadWritePointer = FB->Buf->buf; - bufremain = FB->Buf->BufSize - unread; + bufremain = FB->Buf->BufSize - unread - 1; } - else if (bufremain < (FB->Buf->BufSize / 10)) { - /* get a bigger buffer */ ///TODO: special increase function that won't copy the already read! - IncreaseBuf(FB->Buf, 0, -1); + else if (bufremain < (FB->Buf->BufSize / 10)) + { + /* get a bigger buffer */ + + IncreaseBuf(FB->Buf, 0, FB->Buf->BufUsed + 1); + FB->ReadWritePointer = FB->Buf->buf + unread; - bufremain = FB->Buf->BufSize - unread; + + bufremain = FB->Buf->BufSize - unread - 1; +/*TODO: special increase function that won't copy the already read! */ } } + else if (bufremain < 10) { + IncreaseBuf(FB->Buf, 1, FB->Buf->BufUsed + 10); + + FB->ReadWritePointer = FB->Buf->buf; + + bufremain = FB->Buf->BufSize - FB->Buf->BufUsed - 1; + } } else { FB->ReadWritePointer = FB->Buf->buf; - bufremain = FB->Buf->BufSize; + bufremain = FB->Buf->BufSize - 1; } - n = read(fd, FB->Buf->buf + FB->Buf->BufUsed, bufremain - 1); + + n = read(fd, FB->Buf->buf + FB->Buf->BufUsed, bufremain); if (n > 0) { FB->Buf->BufUsed += n; @@ -3461,6 +3483,9 @@ int StrBuf_write_one_chunk_callback(int fd, short event, IOBuffer *FB) long WriteRemain; int n; + if ((FB == NULL) || (FB->Buf == NULL)) + return -1; + if (FB->ReadWritePointer != NULL) { WriteRemain = FB->Buf->BufUsed -