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 patternsmaint
commit
17ae0b8249
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue