提交 9614b8dc 编写于 作者: L Linus Torvalds

Fix stale index.lock file removal using "atexit()".

Problem noted by Randy Dunlap.
上级 84fe9720
......@@ -63,6 +63,14 @@ static int read_tree(unsigned char *sha1, const char *base, int baselen)
return 0;
}
static int remove_lock = 0;
static void remove_lock_file(void)
{
if (remove_lock)
unlink(".dircache/index.lock");
}
int main(int argc, char **argv)
{
int i, newfd;
......@@ -71,35 +79,28 @@ int main(int argc, char **argv)
newfd = open(".dircache/index.lock", O_RDWR | O_CREAT | O_EXCL, 0600);
if (newfd < 0)
usage("unable to create new cachefile");
atexit(remove_lock_file);
remove_lock = 1;
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
/* "-m" stands for "merge" current directory cache */
if (!strcmp(arg, "-m")) {
if (active_cache) {
fprintf(stderr, "read-tree: cannot merge old cache on top of new\n");
goto out;
}
if (read_cache() < 0) {
fprintf(stderr, "read-tree: corrupt directory cache\n");
goto out;
}
if (active_cache)
usage("read-tree: cannot merge old cache on top of new");
if (read_cache() < 0)
usage("read-tree: corrupt directory cache");
continue;
}
if (get_sha1_hex(arg, sha1) < 0) {
fprintf(stderr, "read-tree [-m] <sha1>\n");
goto out;
}
if (read_tree(sha1, "", 0) < 0) {
fprintf(stderr, "failed to unpack tree object %s\n", arg);
goto out;
}
if (get_sha1_hex(arg, sha1) < 0)
usage("read-tree [-m] <sha1>");
if (read_tree(sha1, "", 0) < 0)
usage("failed to unpack tree object %s", arg);
}
if (!write_cache(newfd, active_cache, active_nr) && !rename(".dircache/index.lock", ".dircache/index"))
return 0;
out:
unlink(".dircache/index.lock");
exit(1);
if (write_cache(newfd, active_cache, active_nr) ||
rename(".dircache/index.lock", ".dircache/index"))
usage("unable to write new index file");
remove_lock = 0;
return 0;
}
......@@ -230,22 +230,30 @@ static int verify_path(char *path)
}
}
static int remove_lock = 0;
static void remove_lock_file(void)
{
if (remove_lock)
unlink(".dircache/index.lock");
}
int main(int argc, char **argv)
{
int i, newfd, entries;
int allow_options = 1;
newfd = open(".dircache/index.lock", O_RDWR | O_CREAT | O_EXCL, 0600);
if (newfd < 0)
usage("unable to create new cachefile");
atexit(remove_lock_file);
remove_lock = 1;
entries = read_cache();
if (entries < 0) {
perror("cache corrupted");
return -1;
}
if (entries < 0)
usage("cache corrupted");
newfd = open(".dircache/index.lock", O_RDWR | O_CREAT | O_EXCL, 0600);
if (newfd < 0) {
perror("unable to create new cachefile");
return -1;
}
for (i = 1 ; i < argc; i++) {
char *path = argv[i];
......@@ -272,14 +280,13 @@ int main(int argc, char **argv)
fprintf(stderr, "Ignoring path %s\n", argv[i]);
continue;
}
if (add_file_to_cache(path)) {
fprintf(stderr, "Unable to add %s to database\n", path);
goto out;
}
if (add_file_to_cache(path))
usage("Unable to add %s to database", path);
}
if (!write_cache(newfd, active_cache, active_nr) && !rename(".dircache/index.lock", ".dircache/index"))
return 0;
out:
unlink(".dircache/index.lock");
if (write_cache(newfd, active_cache, active_nr) ||
rename(".dircache/index.lock", ".dircache/index"))
usage("Unable to write new cachefile");
remove_lock = 0;
return 0;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册