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:
commit
78861eb58a
14
tempfile.c
14
tempfile.c
@ -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;
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user