trace2: remove use of ALLOC_ARRAY()
The banned-die.h header is used to prevent use of helper methods that call die(). Remove use of the ALLOC_ARRAY() helper, which calls die() on allocation failures. Replace the use in trace2.c with a more direct allocation and soft failure when allocation fails. This prevents die() recursion loops when memory allocation fails and trace2 logs are enabled. The tricky part about this change is how to handle the results from redact_arg(), which is a 'const char *' result because it might be a pointer directly to the externally-controlled argument. When it is different from the argument, then it is indeed a newly-allocated string that we need to free before returning. This requires using a (char *) cast to allow a change. Signed-off-by: Derrick Stolee <stolee@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>seen
parent
c331d73b3e
commit
ba926329f9
|
|
@ -17,4 +17,7 @@
|
||||||
#undef xstrdup
|
#undef xstrdup
|
||||||
#define xstrdup(str) BANNED(xstrdup)
|
#define xstrdup(str) BANNED(xstrdup)
|
||||||
|
|
||||||
|
#undef ALLOC_ARRAY
|
||||||
|
#define ALLOC_ARRAY(x, alloc) BANNED(ALLOC_ARRAY)
|
||||||
|
|
||||||
#endif /* BANNED_DIE_H */
|
#endif /* BANNED_DIE_H */
|
||||||
|
|
|
||||||
16
trace2.c
16
trace2.c
|
|
@ -305,7 +305,11 @@ static const char **redact_argv(const char **argv)
|
||||||
for (j = 0; argv[j]; j++)
|
for (j = 0; argv[j]; j++)
|
||||||
; /* keep counting */
|
; /* keep counting */
|
||||||
|
|
||||||
ALLOC_ARRAY(ret, j + 1);
|
ret = calloc(j + 1, sizeof(*ret));
|
||||||
|
if (!ret) {
|
||||||
|
free((char *)redacted);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
ret[j] = NULL;
|
ret[j] = NULL;
|
||||||
|
|
||||||
for (j = 0; j < i; j++)
|
for (j = 0; j < i; j++)
|
||||||
|
|
@ -346,6 +350,8 @@ void trace2_cmd_start_fl(const char *file, int line, const char **argv)
|
||||||
us_elapsed_absolute = tr2tls_absolute_elapsed(us_now);
|
us_elapsed_absolute = tr2tls_absolute_elapsed(us_now);
|
||||||
|
|
||||||
redacted = redact_argv(argv);
|
redacted = redact_argv(argv);
|
||||||
|
if (!redacted)
|
||||||
|
return;
|
||||||
|
|
||||||
for_each_wanted_builtin (j, tgt_j)
|
for_each_wanted_builtin (j, tgt_j)
|
||||||
if (tgt_j->pfn_start_fl)
|
if (tgt_j->pfn_start_fl)
|
||||||
|
|
@ -514,6 +520,7 @@ void trace2_child_start_fl(const char *file, int line,
|
||||||
uint64_t us_now;
|
uint64_t us_now;
|
||||||
uint64_t us_elapsed_absolute;
|
uint64_t us_elapsed_absolute;
|
||||||
const char **orig_argv = cmd->args.v;
|
const char **orig_argv = cmd->args.v;
|
||||||
|
const char **redacted;
|
||||||
|
|
||||||
if (!trace2_enabled)
|
if (!trace2_enabled)
|
||||||
return;
|
return;
|
||||||
|
|
@ -531,7 +538,10 @@ void trace2_child_start_fl(const char *file, int line,
|
||||||
* temporarily replace the original argv (inside the `strvec`)
|
* temporarily replace the original argv (inside the `strvec`)
|
||||||
* with a possibly redacted version.
|
* with a possibly redacted version.
|
||||||
*/
|
*/
|
||||||
cmd->args.v = redact_argv(orig_argv);
|
redacted = redact_argv(orig_argv);
|
||||||
|
if (!redacted)
|
||||||
|
return;
|
||||||
|
cmd->args.v = redacted;
|
||||||
|
|
||||||
for_each_wanted_builtin (j, tgt_j)
|
for_each_wanted_builtin (j, tgt_j)
|
||||||
if (tgt_j->pfn_child_start_fl)
|
if (tgt_j->pfn_child_start_fl)
|
||||||
|
|
@ -623,6 +633,8 @@ int trace2_exec_fl(const char *file, int line, const char *exe,
|
||||||
exec_id = tr2tls_locked_increment(&tr2_next_exec_id);
|
exec_id = tr2tls_locked_increment(&tr2_next_exec_id);
|
||||||
|
|
||||||
redacted = redact_argv(argv);
|
redacted = redact_argv(argv);
|
||||||
|
if (!redacted)
|
||||||
|
return exec_id;
|
||||||
|
|
||||||
for_each_wanted_builtin (j, tgt_j)
|
for_each_wanted_builtin (j, tgt_j)
|
||||||
if (tgt_j->pfn_exec_fl)
|
if (tgt_j->pfn_exec_fl)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue