]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: compile time checks for buffer creation
authorPhil Carmody <phil@dovecot.fi>
Mon, 28 Jul 2014 13:45:33 +0000 (16:45 +0300)
committerPhil Carmody <phil@dovecot.fi>
Mon, 28 Jul 2014 13:45:33 +0000 (16:45 +0300)
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@dovecot.fi>
src/lib/buffer.c
src/lib/buffer.h

index 4531c5c47b08daa260f4a138d79c996d48efd88a..641445e91e8f4643661144386aef46c201fdba5d 100644 (file)
@@ -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)
 {
index 85b8d76dd4b681a1897141f8acb44b0873411a53..9a604331d3659ab5dd2a96c20bcece000b3dbed0 100644 (file)
@@ -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);