From: René Scharfe Date: Fri, 5 Apr 2024 10:53:23 +0000 (+0200) Subject: apply: avoid fixed-size buffer in create_one_file() X-Git-Tag: v2.45.0-rc0~21^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9126cb3186112f160a601e9a7eda29dd43227576;p=thirdparty%2Fgit.git apply: avoid fixed-size buffer in create_one_file() PATH_MAX is not always a hard limit and 'path' in create_one_file() could be longer -- it's taken from the patch file and allocated dynamically. Allocate the name of the temporary file on the heap as well instead of using a fixed-size buffer to avoid that arbitrary limit. Resist the temptation of using the more convenient mkpath() to avoid introducing a dependency on a static variable deep inside the apply machinery. Take care to work around (arguably buggy) implementations of free(3) that modify errno, by calling it only after using the errno value. Suggested-by: Jeff King Helped-by: Jeff King Signed-off-by: René Scharfe Signed-off-by: Junio C Hamano --- diff --git a/apply.c b/apply.c index 7608e3301c..925dbde713 100644 --- a/apply.c +++ b/apply.c @@ -4430,6 +4430,7 @@ static int create_one_file(struct apply_state *state, const char *buf, unsigned long size) { + char *newpath = NULL; int res; if (state->cached) @@ -4491,24 +4492,26 @@ static int create_one_file(struct apply_state *state, unsigned int nr = getpid(); for (;;) { - char newpath[PATH_MAX]; - mksnpath(newpath, sizeof(newpath), "%s~%u", path, nr); + newpath = mkpathdup("%s~%u", path, nr); res = try_create_file(state, newpath, mode, buf, size); if (res < 0) - return -1; + goto out; if (!res) { if (!rename(newpath, path)) - return 0; + goto out; unlink_or_warn(newpath); break; } if (errno != EEXIST) break; ++nr; + FREE_AND_NULL(newpath); } } - return error_errno(_("unable to write file '%s' mode %o"), - path, mode); + res = error_errno(_("unable to write file '%s' mode %o"), path, mode); +out: + free(newpath); + return res; } static int add_conflicted_stages_file(struct apply_state *state,