find_hook: keep our own static buffer
The find_hook function returns the results of git_path, which is a static buffer shared by other path-related calls. Returning such a buffer is slightly dangerous, because it can be overwritten by seemingly unrelated functions. Let's at least keep our _own_ static buffer, so you can only get in trouble by calling find_hook in quick succession, which is less likely to happen and more obvious to notice. While we're at it, let's add some documentation of the function's limitations. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
470e28d4e1
commit
03f2c7731b
@ -797,11 +797,13 @@ int finish_async(struct async *async)
|
|||||||
|
|
||||||
const char *find_hook(const char *name)
|
const char *find_hook(const char *name)
|
||||||
{
|
{
|
||||||
const char *path = git_path("hooks/%s", name);
|
static struct strbuf path = STRBUF_INIT;
|
||||||
if (access(path, X_OK) < 0)
|
|
||||||
path = NULL;
|
|
||||||
|
|
||||||
return path;
|
strbuf_reset(&path);
|
||||||
|
strbuf_git_path(&path, "hooks/%s", name);
|
||||||
|
if (access(path.buf, X_OK) < 0)
|
||||||
|
return NULL;
|
||||||
|
return path.buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
int run_hook_ve(const char *const *env, const char *name, va_list args)
|
int run_hook_ve(const char *const *env, const char *name, va_list args)
|
||||||
|
@ -52,6 +52,11 @@ int start_command(struct child_process *);
|
|||||||
int finish_command(struct child_process *);
|
int finish_command(struct child_process *);
|
||||||
int run_command(struct child_process *);
|
int run_command(struct child_process *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the path to the hook file, or NULL if the hook is missing
|
||||||
|
* or disabled. Note that this points to static storage that will be
|
||||||
|
* overwritten by further calls to find_hook and run_hook_*.
|
||||||
|
*/
|
||||||
extern const char *find_hook(const char *name);
|
extern const char *find_hook(const char *name);
|
||||||
LAST_ARG_MUST_BE_NULL
|
LAST_ARG_MUST_BE_NULL
|
||||||
extern int run_hook_le(const char *const *env, const char *name, ...);
|
extern int run_hook_le(const char *const *env, const char *name, ...);
|
||||||
|
Loading…
Reference in New Issue
Block a user