Browse Source

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>
maint
Martin Ågren 7 years ago committed by Junio C Hamano
parent
commit
f132a127ee
  1. 19
      sha1_file.c

19
sha1_file.c

@ -456,19 +456,19 @@ struct alternate_object_database *alloc_alt_odb(const char *dir) @@ -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) @@ -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…
Cancel
Save