]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
liblib: Added unit test for hash methods to make sure they don't do read access beyon...
authorTimo Sirainen <tss@iki.fi>
Wed, 7 May 2014 10:02:29 +0000 (13:02 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 7 May 2014 10:02:29 +0000 (13:02 +0300)
This currently fails for MD4 and MD5, so they need to be fixed/replaced..

src/lib/Makefile.am
src/lib/test-hash-method.c [new file with mode: 0644]
src/lib/test-lib.c
src/lib/test-lib.h

index a6e9e53f2a6665e9d3e920a3b13715e74b083d09..9d74ef90197fedd0036c5faa49de47e4cb97d210 100644 (file)
@@ -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 (file)
index 0000000..9b6b951
--- /dev/null
@@ -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]);
+}
index 4759d588bfb0a73111aeb6dbafe1426669a6333c..3a444abe4c01d31a50c8868d6ad127c14feac0bb 100644 (file)
@@ -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,
index 96e9f65991159b850b35ec7908601cd1d111c31a..40d90daaa256c18477280f0bef1db094b74f5d3b 100644 (file)
@@ -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);