summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 66bf85a)
raw | patch | inline | side by side (parent: 66bf85a)
author | Junio C Hamano <junkio@cox.net> | |
Sun, 25 Sep 2005 23:28:51 +0000 (16:28 -0700) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Mon, 26 Sep 2005 02:25:09 +0000 (19:25 -0700) |
Signed-off-by: Junio C Hamano <junkio@cox.net>
update-ref.c | patch | blob | history |
diff --git a/update-ref.c b/update-ref.c
index 127ef99eeda03de4ef84a2cfbe473df8f896e3f4..01496f6a92f68d25dd160ec7c42004d7e395fe5b 100644 (file)
--- a/update-ref.c
+++ b/update-ref.c
#include "cache.h"
#include "refs.h"
+#include <ctype.h>
static const char git_update_ref_usage[] = "git-update-ref <refname> <value> [<oldval>]";
return path;
}
+static int re_verify(const char *path, unsigned char *oldsha1, unsigned char *currsha1)
+{
+ char buf[40];
+ int fd = open(path, O_RDONLY), nr;
+ if (fd < 0)
+ return -1;
+ nr = read(fd, buf, 40);
+ close(fd);
+ if (nr != 40 || get_sha1_hex(buf, currsha1) < 0)
+ return -1;
+ return memcmp(oldsha1, currsha1, 20) ? -1 : 0;
+}
+
int main(int argc, char **argv)
{
char *hex;
}
/*
- * FIXME!
- *
- * We should re-read the old ref here, and re-verify that it
- * matches "oldsha1". Otherwise there's a small race.
+ * Re-read the ref after getting the lock to verify
*/
+ if (oldval && re_verify(path, oldsha1, currsha1) < 0) {
+ unlink(lockpath);
+ die("Ref lock failed");
+ }
+ /*
+ * Finally, replace the old ref with the new one
+ */
if (rename(lockpath, path) < 0) {
unlink(lockpath);
die("Unable to create %s", path);