dovecot-2.2: lib: compile time checks for buffer creation

dovecot at dovecot.org dovecot at dovecot.org
Mon Jul 28 13:54:30 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/5601d3e9d2a3
changeset: 17654:5601d3e9d2a3
user:      Phil Carmody <phil at dovecot.fi>
date:      Mon Jul 28 16:45:33 2014 +0300
description:
lib: compile time checks for buffer creation
Ensure the data buffer has as much space as the size parameter claims.
This uses the strictest test GCC provides - the smallest containing object,
and returning 0 for unknown size.

Signed-off-by: Phil Carmody <phil at dovecot.fi>

diffstat:

 src/lib/buffer.c |  2 ++
 src/lib/buffer.h |  8 ++++++++
 2 files changed, 10 insertions(+), 0 deletions(-)

diffs (37 lines):

diff -r 9bf0c6d936ef -r 5601d3e9d2a3 src/lib/buffer.c
--- a/src/lib/buffer.c	Mon Jul 28 16:45:33 2014 +0300
+++ b/src/lib/buffer.c	Mon Jul 28 16:45:33 2014 +0300
@@ -93,6 +93,7 @@
 	i_assert(buf->used <= buf->alloc);
 }
 
+#undef buffer_create_from_data
 void buffer_create_from_data(buffer_t *buffer, void *data, size_t size)
 {
 	struct real_buffer *buf;
@@ -109,6 +110,7 @@
 	memset(data, 0, size);
 }
 
+#undef buffer_create_from_const_data
 void buffer_create_from_const_data(buffer_t *buffer,
 				   const void *data, size_t size)
 {
diff -r 9bf0c6d936ef -r 5601d3e9d2a3 src/lib/buffer.h
--- a/src/lib/buffer.h	Mon Jul 28 16:45:33 2014 +0300
+++ b/src/lib/buffer.h	Mon Jul 28 16:45:33 2014 +0300
@@ -18,6 +18,14 @@
 /* Create a non-modifiable buffer from given data. */
 void buffer_create_from_const_data(buffer_t *buffer,
 				   const void *data, size_t size);
+#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) > 401
+#define buffer_create_from_data(b,d,s) ({					\
+	(void)COMPILE_ERROR_IF_TRUE(__builtin_object_size((d),3) < ((s)?(s):1)); \
+	buffer_create_from_data((b), (d), (s)); })
+#define buffer_create_from_const_data(b,d,s) ({					\
+	(void)COMPILE_ERROR_IF_TRUE(__builtin_object_size((d),3) < ((s)?(s):1)); \
+	buffer_create_from_const_data((b), (d), (s)); })
+#endif
 /* Creates a dynamically growing buffer. Whenever write would exceed the
    current size it's grown. */
 buffer_t *buffer_create_dynamic(pool_t pool, size_t init_size);


More information about the dovecot-cvs mailing list