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