On Tue, Sep 27, 2022 at 07:19:01PM +0000, John Cai via GitGitGadget wrote: > Since we can't do the cleanup in a portable and signal-safe way, skip > the cleanup when we're handling a signal. Thanks, this looks fine to me, though I think there are a few extra cleanup opportunities that could be squashed in: diff --git a/tmp-objdir.c b/tmp-objdir.c index 5d5f15f6d7..2fb0ec8317 100644 --- a/tmp-objdir.c +++ b/tmp-objdir.c @@ -18,7 +18,7 @@ struct tmp_objdir { /* * Allow only one tmp_objdir at a time in a running process, which simplifies - * our signal/atexit cleanup routines. It's doubtful callers will ever need + * our atexit cleanup routine. It's doubtful callers will ever need * more than one, and we can expand later if so. You can have many such * tmp_objdirs simultaneously in many processes, of course. */ @@ -31,7 +31,7 @@ static void tmp_objdir_free(struct tmp_objdir *t) free(t); } -static int tmp_objdir_destroy_1(struct tmp_objdir *t) +static int tmp_objdir_destroy(struct tmp_objdir *t) { int err; @@ -44,23 +44,13 @@ static int tmp_objdir_destroy_1(struct tmp_objdir *t) if (t->prev_odb) restore_primary_odb(t->prev_odb, t->path.buf); - /* - * This may use malloc via strbuf_grow(), but we should - * have pre-grown t->path sufficiently so that this - * doesn't happen in practice. - */ err = remove_dir_recursively(&t->path, 0); tmp_objdir_free(t); return err; } -int tmp_objdir_destroy(struct tmp_objdir *t) -{ - return tmp_objdir_destroy_1(t); -} - static void remove_tmp_objdir(void) { tmp_objdir_destroy(the_tmp_objdir); @@ -139,14 +129,6 @@ struct tmp_objdir *tmp_objdir_create(const char *prefix) */ strbuf_addf(&t->path, "%s/tmp_objdir-%s-XXXXXX", get_object_directory(), prefix); - /* - * Grow the strbuf beyond any filename we expect to be placed in it. - * If tmp_objdir_destroy() is called by a signal handler, then - * we should be able to use the strbuf to remove files without - * having to call malloc. - */ - strbuf_grow(&t->path, 1024); - if (!mkdtemp(t->path.buf)) { /* free, not destroy, as we never touched the filesystem */ tmp_objdir_free(t);