From: Timo Sirainen Date: Wed, 7 May 2014 10:02:29 +0000 (+0300) Subject: liblib: Added unit test for hash methods to make sure they don't do read access beyon... X-Git-Tag: 2.2.13.rc1~33 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b0114f9348060796a29a9042af757e8f99cdd422;p=thirdparty%2Fdovecot%2Fcore.git liblib: Added unit test for hash methods to make sure they don't do read access beyond buffer. This currently fails for MD4 and MD5, so they need to be fixed/replaced.. --- diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index a6e9e53f2a..9d74ef9019 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -275,6 +275,7 @@ test_lib_SOURCES = \ test-buffer.c \ test-crc32.c \ test-hash-format.c \ + test-hash-method.c \ test-hex-binary.c \ test-iso8601-date.c \ test-istream-base64-decoder.c \ diff --git a/src/lib/test-hash-method.c b/src/lib/test-hash-method.c new file mode 100644 index 0000000000..9b6b951052 --- /dev/null +++ b/src/lib/test-hash-method.c @@ -0,0 +1,43 @@ +/* Copyright (c) 2014 Dovecot authors, see the included COPYING file */ + +#include "test-lib.h" +#include "mmap-util.h" +#include "hash-method.h" + +static unsigned char *buf; +static unsigned int buf_size; + +static void test_hash_method_one(const struct hash_method *method) +{ + unsigned char *ctx, *digest; + unsigned int i; + + test_begin(t_strdup_printf("hash method %s", method->name)); + + ctx = i_malloc(method->context_size); + digest = i_malloc(method->digest_size); + method->init(ctx); + + /* make sure the code doesn't try to access data past boundaries */ + for (i = 0; i < buf_size; i++) + method->loop(ctx, buf + buf_size - i, i); + method->result(ctx, digest); + + i_free(ctx); + i_free(digest); + test_end(); +} + +void test_hash_method(void) +{ + unsigned int i; + + buf_size = mmap_get_page_size(); + buf = mmap(NULL, buf_size*2, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + mprotect(buf + buf_size, buf_size, PROT_NONE); + memset(buf, 0, buf_size); + + for (i = 0; hash_methods[i] != NULL; i++) + test_hash_method_one(hash_methods[i]); +} diff --git a/src/lib/test-lib.c b/src/lib/test-lib.c index 4759d588bf..3a444abe4c 100644 --- a/src/lib/test-lib.c +++ b/src/lib/test-lib.c @@ -12,6 +12,7 @@ int main(void) test_buffer, test_crc32, test_hash_format, + test_hash_method, test_hex_binary, test_iso8601_date, test_istream_base64_decoder, diff --git a/src/lib/test-lib.h b/src/lib/test-lib.h index 96e9f65991..40d90daaa2 100644 --- a/src/lib/test-lib.h +++ b/src/lib/test-lib.h @@ -11,6 +11,7 @@ void test_bsearch_insert_pos(void); void test_buffer(void); void test_crc32(void); void test_hash_format(void); +void test_hash_method(void); void test_hex_binary(void); void test_iso8601_date(void); void test_istream_base64_decoder(void);