summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntony Dovgal <tony2001@php.net>2008-08-18 14:29:55 +0000
committerAntony Dovgal <tony2001@php.net>2008-08-18 14:29:55 +0000
commit523cccc09d788c789531b2eeabdd453b59386cc2 (patch)
tree5af70eb24526d5bcf5fdfd475b9a7063743c6815
parent991ae6e7d3bde939df0abc69654236506d3210a3 (diff)
downloadphp-git-523cccc09d788c789531b2eeabdd453b59386cc2.tar.gz
MFH: fix bug #45028 (CRC32 output endianness is different between crc32() and hash())
-rw-r--r--NEWS2
-rw-r--r--ext/hash/hash_crc32.c12
-rw-r--r--ext/hash/tests/crc32.phpt12
-rw-r--r--ext/hash/tests/hash_copy_001.phpt8
4 files changed, 23 insertions, 11 deletions
diff --git a/NEWS b/NEWS
index 4bac308412..e6d34ea9e8 100644
--- a/NEWS
+++ b/NEWS
@@ -37,6 +37,8 @@ PHP NEWS
- Fixed bug #45384 (parse_ini_file will result in parse error with no trailing
newline). (Arnaud)
- Fixed bug #45044 (relative paths not resolved correctly). (Dmitry)
+- Fixed bug #45028 (CRC32 output endianness is different between crc32()
+ and hash()). (Tony)
- Fixed bug #44925 (preg_grep() modifies input array). (Nuno)
- Fixed bug #44842 (parse_ini_file keys that start/end with underscore).
(Arnaud)
diff --git a/ext/hash/hash_crc32.c b/ext/hash/hash_crc32.c
index ccc6de3b0d..9f03ad0704 100644
--- a/ext/hash/hash_crc32.c
+++ b/ext/hash/hash_crc32.c
@@ -56,6 +56,16 @@ PHP_HASH_API void PHP_CRC32Final(unsigned char digest[4], PHP_CRC32_CTX *context
context->state = 0;
}
+PHP_HASH_API void PHP_CRC32BFinal(unsigned char digest[4], PHP_CRC32_CTX *context)
+{
+ context->state=~context->state;
+ digest[0] = (unsigned char) ((context->state >> 24) & 0xff);
+ digest[1] = (unsigned char) ((context->state >> 16) & 0xff);
+ digest[2] = (unsigned char) ((context->state >> 8) & 0xff);
+ digest[3] = (unsigned char) (context->state & 0xff);
+ context->state = 0;
+}
+
PHP_HASH_API int PHP_CRC32Copy(const php_hash_ops *ops, PHP_CRC32_CTX *orig_context, PHP_CRC32_CTX *copy_context)
{
copy_context->state = orig_context->state;
@@ -75,7 +85,7 @@ const php_hash_ops php_hash_crc32_ops = {
const php_hash_ops php_hash_crc32b_ops = {
(php_hash_init_func_t) PHP_CRC32Init,
(php_hash_update_func_t) PHP_CRC32BUpdate,
- (php_hash_final_func_t) PHP_CRC32Final,
+ (php_hash_final_func_t) PHP_CRC32BFinal,
(php_hash_copy_func_t) PHP_CRC32Copy,
4, /* what to say here? */
4,
diff --git a/ext/hash/tests/crc32.phpt b/ext/hash/tests/crc32.phpt
index c51209c60d..3862fb17a6 100644
--- a/ext/hash/tests/crc32.phpt
+++ b/ext/hash/tests/crc32.phpt
@@ -28,9 +28,9 @@ echo hash('crc32b', '12345678901234567890123456789012345678901234567890123456789
882174a0
96790816
00000000
-43beb7e8
-c2412435
-7f9d1520
-bd50274c
-d2e6c21f
-724aa97c
+e8b7be43
+352441c2
+20159d7f
+4c2750bd
+1fc2e6d2
+7ca94a72
diff --git a/ext/hash/tests/hash_copy_001.phpt b/ext/hash/tests/hash_copy_001.phpt
index e3f5081f01..a6d4c61797 100644
--- a/ext/hash/tests/hash_copy_001.phpt
+++ b/ext/hash/tests/hash_copy_001.phpt
@@ -75,8 +75,8 @@ string(8) "28097c6f"
string(8) "28097c6f"
string(8) "e5cfc160"
string(8) "e5cfc160"
-string(8) "4e7a1469"
-string(8) "4e7a1469"
+string(8) "69147a4e"
+string(8) "69147a4e"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(40) "fabdf6905f3ba18a3c93d6a16b91e31f7222a7a4"
@@ -155,8 +155,8 @@ string(8) "28097c6f"
string(8) "471714d9"
string(8) "e5cfc160"
string(8) "59f8d3d2"
-string(8) "4e7a1469"
-string(8) "9939e63e"
+string(8) "69147a4e"
+string(8) "3ee63999"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(32) "ebeeeb05c18af1e53d2d127b561d5e0d"
string(40) "fabdf6905f3ba18a3c93d6a16b91e31f7222a7a4"