From 5c2a7fbc362e4227ced84c32c3fdc9682d085962 Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Wed, 13 Apr 2005 02:14:06 -0700 Subject: [PATCH] [PATCH] SHA1 naive collision checking When compiled with -DCOLLISION_CHECK, we will check against SHA1 collisions when writing to the object database. From: Christopher Li Signed-off-by: Petr Baudis --- Makefile | 4 ++++ read-cache.c | 21 +++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 7c2c1b55..ac61a61b 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,8 @@ +# -DCOLLISION_CHECK if you believe that SHA1's +# 1461501637330902918203684832716283019655932542976 hashes do not give you +# enough guarantees about no collisions between objects ever hapenning. CFLAGS=-g -O3 -Wall + CC=gcc PROG= update-cache show-diff init-db write-tree read-tree commit-tree \ diff --git a/read-cache.c b/read-cache.c index 54536944..2ee96bc9 100644 --- a/read-cache.c +++ b/read-cache.c @@ -216,8 +216,25 @@ int write_sha1_buffer(const unsigned char *sha1, void *buf, unsigned int size) int fd; fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666); - if (fd < 0) - return (errno == EEXIST) ? 0 : -1; + if (fd < 0) { + void *map; + static int error(const char * string); + + if (errno != EEXIST) + return -1; +#ifndef COLLISION_CHECK + fd = open(filename, O_RDONLY); + if (fd < 0) + return -1; + map = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); + if (map == MAP_FAILED) + return -1; + if (memcmp(buf, map, size)) + return error("SHA1 collision detected!" + " This is bad, bad, BAD!\a\n"); +#endif + return 0; + } write(fd, buf, size); close(fd); return 0; -- 2.11.0