Andrew's git
/
gitweb.git
/ diff
summary
|
log
|
commit
| diff |
tree
commit
grep
author
committer
pickaxe
?
re
Plug a small race in update-ref.c.
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
raw
|
patch
|
inline
| side by side (parent:
66bf85a
)
diff --git
a/update-ref.c
b/update-ref.c
index 127ef99eeda03de4ef84a2cfbe473df8f896e3f4..01496f6a92f68d25dd160ec7c42004d7e395fe5b 100644
(file)
--- a/
update-ref.c
+++ b/
update-ref.c
@@
-1,5
+1,6
@@
#include "cache.h"
#include "refs.h"
#include "cache.h"
#include "refs.h"
+#include <ctype.h>
static const char git_update_ref_usage[] = "git-update-ref <refname> <value> [<oldval>]";
static const char git_update_ref_usage[] = "git-update-ref <refname> <value> [<oldval>]";
@@
-50,6
+51,19
@@
const char *resolve_ref(const char *path, unsigned char *sha1)
return path;
}
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;
int main(int argc, char **argv)
{
char *hex;
@@
-97,12
+111,16
@@
int main(int argc, char **argv)
}
/*
}
/*
- * 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);
if (rename(lockpath, path) < 0) {
unlink(lockpath);
die("Unable to create %s", path);