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. 45
      read-tree.c
  2. 41
      update-cache.c

45
read-tree.c

@ -63,6 +63,14 @@ static int read_tree(unsigned char *sha1, const char *base, int baselen)
return 0; 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 main(int argc, char **argv)
{ {
int i, newfd; 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); newfd = open(".dircache/index.lock", O_RDWR | O_CREAT | O_EXCL, 0600);
if (newfd < 0) if (newfd < 0)
usage("unable to create new cachefile"); usage("unable to create new cachefile");
atexit(remove_lock_file);
remove_lock = 1;


for (i = 1; i < argc; i++) { for (i = 1; i < argc; i++) {
const char *arg = argv[i]; const char *arg = argv[i];


/* "-m" stands for "merge" current directory cache */ /* "-m" stands for "merge" current directory cache */
if (!strcmp(arg, "-m")) { if (!strcmp(arg, "-m")) {
if (active_cache) { if (active_cache)
fprintf(stderr, "read-tree: cannot merge old cache on top of new\n"); usage("read-tree: cannot merge old cache on top of new");
goto out; if (read_cache() < 0)
} usage("read-tree: corrupt directory cache");
if (read_cache() < 0) {
fprintf(stderr, "read-tree: corrupt directory cache\n");
goto out;
}
continue; continue;
} }
if (get_sha1_hex(arg, sha1) < 0) { if (get_sha1_hex(arg, sha1) < 0)
fprintf(stderr, "read-tree [-m] <sha1>\n"); usage("read-tree [-m] <sha1>");
goto out; if (read_tree(sha1, "", 0) < 0)
} usage("failed to unpack tree object %s", arg);
if (read_tree(sha1, "", 0) < 0) {
fprintf(stderr, "failed to unpack tree object %s\n", arg);
goto out;
}
} }
if (!write_cache(newfd, active_cache, active_nr) && !rename(".dircache/index.lock", ".dircache/index")) if (write_cache(newfd, active_cache, active_nr) ||
return 0; rename(".dircache/index.lock", ".dircache/index"))

usage("unable to write new index file");
out: remove_lock = 0;
unlink(".dircache/index.lock"); return 0;
exit(1);
} }

41
update-cache.c

@ -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 main(int argc, char **argv)
{ {
int i, newfd, entries; int i, newfd, entries;
int allow_options = 1; 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(); entries = read_cache();
if (entries < 0) { if (entries < 0)
perror("cache corrupted"); usage("cache corrupted");
return -1;
}


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++) { for (i = 1 ; i < argc; i++) {
char *path = argv[i]; char *path = argv[i];


@ -272,14 +280,13 @@ int main(int argc, char **argv)
fprintf(stderr, "Ignoring path %s\n", argv[i]); fprintf(stderr, "Ignoring path %s\n", argv[i]);
continue; continue;
} }
if (add_file_to_cache(path)) { if (add_file_to_cache(path))
fprintf(stderr, "Unable to add %s to database\n", path); usage("Unable to add %s to database", path);
goto out;
}
} }
if (!write_cache(newfd, active_cache, active_nr) && !rename(".dircache/index.lock", ".dircache/index")) if (write_cache(newfd, active_cache, active_nr) ||
return 0; rename(".dircache/index.lock", ".dircache/index"))
out: usage("Unable to write new cachefile");
unlink(".dircache/index.lock");
remove_lock = 0;
return 0; return 0;
} }
Loading…
Cancel
Save