[dovecot-cvs] dovecot/src/lib buffer.c,1.2,1.3

cras at procontrol.fi cras at procontrol.fi
Sat Dec 21 21:10:37 EET 2002


Update of /home/cvs/dovecot/src/lib
In directory danu:/tmp/cvs-serv19660

Modified Files:
	buffer.c 
Log Message:
Fixed several bugs, added a small testsuite. Still requires careful auditing.



Index: buffer.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/buffer.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- buffer.c	18 Dec 2002 15:15:41 -0000	1.2
+++ buffer.c	21 Dec 2002 19:10:35 -0000	1.3
@@ -43,6 +43,8 @@
 	if (min_size == 0)
 		return;
 
+	i_assert(buf->w_buffer == NULL || buf->alloced);
+
 	buf->alloc = min_size;
 	if (buf->w_buffer == NULL)
 		buf->w_buffer = p_malloc(buf->pool, buf->alloc);
@@ -102,13 +104,14 @@
 				return FALSE;
 
 			new_size = buf->limit;
-			if (new_size == buf->alloc || new_size <= *pos)
+			if (*pos >= new_size)
 				return FALSE;
 
 			*data_size = new_size - *pos;
 		}
 
-		buffer_alloc(buf, new_size);
+		if (new_size != buf->alloc)
+			buffer_alloc(buf, new_size);
 	}
 
 	if (new_size > buf->used)
@@ -142,7 +145,7 @@
 
 	buf = p_new(pool, Buffer, 1);
 	buf->pool = pool;
-	buf->max_alloc = buf->limit = size;
+	buf->alloc = buf->max_alloc = buf->limit = size;
 	buf->r_buffer = buf->w_buffer = data;
 	return buf;
 }
@@ -153,7 +156,7 @@
 
 	buf = p_new(pool, Buffer, 1);
 	buf->pool = pool;
-	buf->used = buf->max_alloc = buf->limit = size;
+	buf->used = buf->alloc = buf->max_alloc = buf->limit = size;
 	buf->r_buffer = data;
 	buf->readonly = TRUE;
 	return buf;
@@ -252,10 +255,9 @@
 
 	if (size < end_size) {
 		/* delete from between */
+		end_size -= size;
 		memmove(buf->w_buffer + buf->start_pos + pos,
-			buf->w_buffer + buf->start_pos + pos + size,
-			end_size - size);
-		end_size = size;
+			buf->w_buffer + buf->start_pos + pos + size, end_size);
 	} else {
 		/* delete the rest of the buffer */
 		size = end_size;
@@ -368,3 +370,51 @@
 {
 	return buf->alloc - buf->start_pos;
 }
+
+#ifdef BUFFER_TEST
+/* gcc buffer.c -o buffer liblib.a -Wall -DHAVE_CONFIG_H -DBUFFER_TEST -g */
+int main(void)
+{
+	Buffer *buf;
+	char data[12], *bufdata;
+	size_t bufsize;
+
+	memset(data, '!', sizeof(data));
+	bufdata = data + 1;
+	bufsize = sizeof(data)-2;
+
+	buf = buffer_create_data(system_pool, bufdata, bufsize);
+	i_assert(buffer_write(buf, 5, "12345", 5) == 5);
+	i_assert(buf->used == 10);
+	i_assert(buffer_write(buf, 6, "12345", 5) == 4);
+	i_assert(buf->used == 10);
+
+	buf = buffer_create_data(system_pool, bufdata, bufsize);
+	i_assert(buffer_write(buf, 0, "1234567890", 10) == 10);
+	i_assert(buffer_write(buf, 0, "12345678901", 11) == 10);
+	i_assert(buffer_append(buf, "1", 1) == 0);
+	i_assert(buf->used == 10);
+
+	buf = buffer_create_data(system_pool, bufdata, bufsize);
+	i_assert(buffer_append(buf, "12345", 5) == 5);
+	i_assert(buf->used == 5);
+	i_assert(buffer_append(buf, "123456", 6) == 5);
+	i_assert(buf->used == 10);
+
+	buf = buffer_create_data(system_pool, bufdata, bufsize);
+	i_assert(buffer_append(buf, "12345", 5) == 5);
+	i_assert(buffer_insert(buf, 2, "123456", 6) == 5);
+	i_assert(buf->used == 10);
+	i_assert(memcmp(buf->r_buffer, "1212345345", 10) == 0);
+	i_assert(buffer_delete(buf, 2, 5) == 5);
+	i_assert(buf->used == 5);
+	i_assert(memcmp(buf->r_buffer, "12345", 5) == 0);
+	i_assert(buffer_delete(buf, 3, 5) == 2);
+	i_assert(buf->used == 3);
+	i_assert(memcmp(buf->r_buffer, "123", 3) == 0);
+
+	i_assert(data[0] == '!');
+	i_assert(data[sizeof(data)-1] == '!');
+	return 0;
+}
+#endif




More information about the dovecot-cvs mailing list