Merge branch 'rs/tempfile-cleanup-race-fix' into jk/tempfile-active-flag-cleanup

* rs/tempfile-cleanup-race-fix:
  tempfile: avoid directory cleanup race
This commit is contained in:
Junio C Hamano 2022-08-30 14:16:41 -07:00
commit 78861eb58a
2 changed files with 7 additions and 9 deletions

View File

@ -59,14 +59,11 @@ static VOLATILE_LIST_HEAD(tempfile_list);
static void remove_template_directory(struct tempfile *tempfile, static void remove_template_directory(struct tempfile *tempfile,
int in_signal_handler) int in_signal_handler)
{ {
if (tempfile->directorylen > 0 && if (tempfile->directory) {
tempfile->directorylen < tempfile->filename.len &&
tempfile->filename.buf[tempfile->directorylen] == '/') {
strbuf_setlen(&tempfile->filename, tempfile->directorylen);
if (in_signal_handler) if (in_signal_handler)
rmdir(tempfile->filename.buf); rmdir(tempfile->directory);
else else
rmdir_or_warn(tempfile->filename.buf); rmdir_or_warn(tempfile->directory);
} }
} }
@ -115,7 +112,7 @@ static struct tempfile *new_tempfile(void)
tempfile->owner = 0; tempfile->owner = 0;
INIT_LIST_HEAD(&tempfile->list); INIT_LIST_HEAD(&tempfile->list);
strbuf_init(&tempfile->filename, 0); strbuf_init(&tempfile->filename, 0);
tempfile->directorylen = 0; tempfile->directory = NULL;
return tempfile; return tempfile;
} }
@ -141,6 +138,7 @@ static void deactivate_tempfile(struct tempfile *tempfile)
{ {
tempfile->active = 0; tempfile->active = 0;
strbuf_release(&tempfile->filename); strbuf_release(&tempfile->filename);
free(tempfile->directory);
volatile_list_del(&tempfile->list); volatile_list_del(&tempfile->list);
free(tempfile); free(tempfile);
} }
@ -254,7 +252,7 @@ struct tempfile *mks_tempfile_dt(const char *directory_template,
tempfile = new_tempfile(); tempfile = new_tempfile();
strbuf_swap(&tempfile->filename, &sb); strbuf_swap(&tempfile->filename, &sb);
tempfile->directorylen = directorylen; tempfile->directory = xmemdupz(tempfile->filename.buf, directorylen);
tempfile->fd = fd; tempfile->fd = fd;
activate_tempfile(tempfile); activate_tempfile(tempfile);
return tempfile; return tempfile;

View File

@ -82,7 +82,7 @@ struct tempfile {
FILE *volatile fp; FILE *volatile fp;
volatile pid_t owner; volatile pid_t owner;
struct strbuf filename; struct strbuf filename;
size_t directorylen; char *directory;
}; };
/* /*