From 0a568c1e8a8066ce9d6467d891a9717bd2a24b26 Mon Sep 17 00:00:00 2001 From: Phil Carmody Date: Mon, 28 Jul 2014 16:45:33 +0300 Subject: [PATCH] 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 --- src/lib/buffer.c | 2 ++ src/lib/buffer.h | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/lib/buffer.c b/src/lib/buffer.c index 4531c5c47b..641445e91e 100644 --- a/src/lib/buffer.c +++ b/src/lib/buffer.c @@ -93,6 +93,7 @@ buffer_check_limits(struct real_buffer *buf, size_t pos, size_t data_size) 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 @@ void buffer_create_from_data(buffer_t *buffer, void *data, size_t size) 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 --git a/src/lib/buffer.h b/src/lib/buffer.h index 85b8d76dd4..9a604331d3 100644 --- a/src/lib/buffer.h +++ b/src/lib/buffer.h @@ -18,6 +18,14 @@ void buffer_create_from_data(buffer_t *buffer, void *data, size_t size); /* 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); -- 2.47.3