sha1_file: do not leak lock_file
There is no longer any need to allocate and leak a `struct lock_file`. Initialize it on the stack instead. Before this patch, we set `lock = NULL` to signal that we have already rolled back, and that we should not do any more work. We need to take another approach now that we cannot assign NULL. We could, e.g., use `is_lock_file_locked()`. But we already have another variable that we could use instead, `found`. Its scope is only too small. Bump `found` to the scope of the whole function and rearrange the "roll back or write?"-checks to a straightforward if-else on `found`. This also future-proves the code by making it obvious that we intend to take exactly one of these paths. Improved-by: Jeff King <peff@peff.net> Signed-off-by: Martin Ågren <martin.agren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
ea220ee40c
commit
f132a127ee
19
sha1_file.c
19
sha1_file.c
@ -456,19 +456,19 @@ struct alternate_object_database *alloc_alt_odb(const char *dir)
|
||||
|
||||
void add_to_alternates_file(const char *reference)
|
||||
{
|
||||
struct lock_file *lock = xcalloc(1, sizeof(struct lock_file));
|
||||
struct lock_file lock = LOCK_INIT;
|
||||
char *alts = git_pathdup("objects/info/alternates");
|
||||
FILE *in, *out;
|
||||
int found = 0;
|
||||
|
||||
hold_lock_file_for_update(lock, alts, LOCK_DIE_ON_ERROR);
|
||||
out = fdopen_lock_file(lock, "w");
|
||||
hold_lock_file_for_update(&lock, alts, LOCK_DIE_ON_ERROR);
|
||||
out = fdopen_lock_file(&lock, "w");
|
||||
if (!out)
|
||||
die_errno("unable to fdopen alternates lockfile");
|
||||
|
||||
in = fopen(alts, "r");
|
||||
if (in) {
|
||||
struct strbuf line = STRBUF_INIT;
|
||||
int found = 0;
|
||||
|
||||
while (strbuf_getline(&line, in) != EOF) {
|
||||
if (!strcmp(reference, line.buf)) {
|
||||
@ -480,18 +480,15 @@ void add_to_alternates_file(const char *reference)
|
||||
|
||||
strbuf_release(&line);
|
||||
fclose(in);
|
||||
|
||||
if (found) {
|
||||
rollback_lock_file(lock);
|
||||
lock = NULL;
|
||||
}
|
||||
}
|
||||
else if (errno != ENOENT)
|
||||
die_errno("unable to read alternates file");
|
||||
|
||||
if (lock) {
|
||||
if (found) {
|
||||
rollback_lock_file(&lock);
|
||||
} else {
|
||||
fprintf_or_die(out, "%s\n", reference);
|
||||
if (commit_lock_file(lock))
|
||||
if (commit_lock_file(&lock))
|
||||
die_errno("unable to move new alternates file into place");
|
||||
if (alt_odb_tail)
|
||||
link_alt_odb_entries(reference, '\n', NULL, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user