Merge branch 'jk/sparse-fdleak-fix'

A file descriptor left open is now properly closed when "git
sparse-checkout" updates the sparse patterns.

* jk/sparse-fdleak-fix:
  sparse-checkout: use fdopen_lock_file() instead of xfdopen()
  sparse-checkout: check commit_lock_file when writing patterns
  sparse-checkout: consolidate cleanup when writing patterns
maint
Junio C Hamano 2024-09-13 15:27:42 -07:00
commit 17ae0b8249
1 changed files with 10 additions and 11 deletions

View File

@ -327,7 +327,6 @@ static int write_patterns_and_update(struct pattern_list *pl)
{ {
char *sparse_filename; char *sparse_filename;
FILE *fp; FILE *fp;
int fd;
struct lock_file lk = LOCK_INIT; struct lock_file lk = LOCK_INIT;
int result; int result;


@ -336,31 +335,31 @@ static int write_patterns_and_update(struct pattern_list *pl)
if (safe_create_leading_directories(sparse_filename)) if (safe_create_leading_directories(sparse_filename))
die(_("failed to create directory for sparse-checkout file")); die(_("failed to create directory for sparse-checkout file"));


fd = hold_lock_file_for_update(&lk, sparse_filename, hold_lock_file_for_update(&lk, sparse_filename, LOCK_DIE_ON_ERROR);
LOCK_DIE_ON_ERROR);
free(sparse_filename);


result = update_working_directory(pl); result = update_working_directory(pl);
if (result) { if (result) {
rollback_lock_file(&lk); rollback_lock_file(&lk);
clear_pattern_list(pl);
update_working_directory(NULL); update_working_directory(NULL);
return result; goto out;
} }


fp = xfdopen(fd, "w"); fp = fdopen_lock_file(&lk, "w");
if (!fp)
die_errno(_("unable to fdopen %s"), get_lock_file_path(&lk));


if (core_sparse_checkout_cone) if (core_sparse_checkout_cone)
write_cone_to_file(fp, pl); write_cone_to_file(fp, pl);
else else
write_patterns_to_file(fp, pl); write_patterns_to_file(fp, pl);


fflush(fp); if (commit_lock_file(&lk))
commit_lock_file(&lk); die_errno(_("unable to write %s"), sparse_filename);


out:
clear_pattern_list(pl); clear_pattern_list(pl);

free(sparse_filename);
return 0; return result;
} }


enum sparse_checkout_mode { enum sparse_checkout_mode {