Browse Source

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

Problem noted by Randy Dunlap.
maint
Linus Torvalds 20 years ago
parent
commit
9614b8dcf8
  1. 43
      read-tree.c
  2. 41
      update-cache.c

43
read-tree.c

@ -63,6 +63,14 @@ static int read_tree(unsigned char *sha1, const char *base, int baselen) @@ -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) @@ -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"))
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;

out:
unlink(".dircache/index.lock");
exit(1);
}

41
update-cache.c

@ -230,22 +230,30 @@ inside: @@ -230,22 +230,30 @@ inside:
}
}

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) @@ -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;
}
Loading…
Cancel
Save