From 3efdcb59492bd1e0602340a4204003a32b34654a Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sat, 6 Feb 2010 00:36:11 +0200 Subject: [PATCH] crc32*() didn't return a standard CRC32 value. --HG-- branch : HEAD --- src/lib/Makefile.am | 1 + src/lib/crc32.c | 8 ++++++-- src/lib/test-crc32.c | 14 ++++++++++++++ src/lib/test-lib.c | 1 + src/lib/test-lib.h | 1 + 5 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/lib/test-crc32.c diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 3515284344..ccfbec39c4 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -222,6 +222,7 @@ test_lib_SOURCES = \ test-base64.c \ test-bsearch-insert-pos.c \ test-buffer.c \ + test-crc32.c \ test-hex-binary.c \ test-istream-concat.c \ test-istream-crlf.c \ diff --git a/src/lib/crc32.c b/src/lib/crc32.c index 9a7312d161..6ac28ad2bf 100644 --- a/src/lib/crc32.c +++ b/src/lib/crc32.c @@ -60,28 +60,32 @@ static uint32_t crc32tab[256] = { uint32_t crc32_data(const void *data, size_t size) { - return crc32_data_more((uint32_t)-1, data, size); + return crc32_data_more(0, data, size); } uint32_t crc32_data_more(uint32_t crc, const void *data, size_t size) { const uint8_t *p = data, *end = p + size; + crc ^= 0xffffffff; for (; p != end; p++) crc = (crc >> 8) ^ crc32tab[((crc ^ *p) & 0xff)]; + crc ^= 0xffffffff; return crc; } uint32_t crc32_str(const char *str) { - return crc32_str_more((uint32_t)-1, str); + return crc32_str_more(0, str); } uint32_t crc32_str_more(uint32_t crc, const char *str) { const uint8_t *p = (const uint8_t *)str; + crc ^= 0xffffffff; for (; *p != '\0'; p++) crc = (crc >> 8) ^ crc32tab[((crc ^ *p) & 0xff)]; + crc ^= 0xffffffff; return crc; } diff --git a/src/lib/test-crc32.c b/src/lib/test-crc32.c new file mode 100644 index 0000000000..01cc35beaf --- /dev/null +++ b/src/lib/test-crc32.c @@ -0,0 +1,14 @@ +/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */ + +#include "test-lib.h" +#include "crc32.h" + +void test_crc32(void) +{ + const char str[] = "foo\0bar"; + + test_begin("crc32"); + test_assert(crc32_str(str) == 0x8c736521); + test_assert(crc32_data(str, sizeof(str)) == 0x32c9723d); + test_end(); +} diff --git a/src/lib/test-lib.c b/src/lib/test-lib.c index 4ab0f87afa..f1183e02d1 100644 --- a/src/lib/test-lib.c +++ b/src/lib/test-lib.c @@ -10,6 +10,7 @@ int main(void) test_base64, test_bsearch_insert_pos, test_buffer, + test_crc32, test_hex_binary, test_istream_concat, test_istream_crlf, diff --git a/src/lib/test-lib.h b/src/lib/test-lib.h index cd074c7f30..50a880a7a7 100644 --- a/src/lib/test-lib.h +++ b/src/lib/test-lib.h @@ -9,6 +9,7 @@ void test_array(void); void test_base64(void); void test_bsearch_insert_pos(void); void test_buffer(void); +void test_crc32(void); void test_hex_binary(void); void test_istream_concat(void); void test_istream_crlf(void); -- 2.47.3