Merge branch 'jk/tighten-alloc'
Update various codepaths to avoid manually-counted malloc().
* jk/tighten-alloc: (22 commits)
ewah: convert to REALLOC_ARRAY, etc
convert ewah/bitmap code to use xmalloc
diff_populate_gitlink: use a strbuf
transport_anonymize_url: use xstrfmt
git-compat-util: drop mempcpy compat code
sequencer: simplify memory allocation of get_message
test-path-utils: fix normalize_path_copy output buffer size
fetch-pack: simplify add_sought_entry
fast-import: simplify allocation in start_packfile
write_untracked_extension: use FLEX_ALLOC helper
prepare_{git,shell}_cmd: use argv_array
use st_add and st_mult for allocation size computation
convert trivial cases to FLEX_ARRAY macros
use xmallocz to avoid size arithmetic
convert trivial cases to ALLOC_ARRAY
convert manual allocations to argv_array
argv-array: add detach function
add helpers for allocating flex-array structs
harden REALLOC_ARRAY and xcalloc against size_t overflow
tree-diff: catch integer overflow in combine_diff_path allocation
...
This commit is contained in:
28
exec_cmd.c
28
exec_cmd.c
@ -1,6 +1,7 @@
|
||||
#include "cache.h"
|
||||
#include "exec_cmd.h"
|
||||
#include "quote.h"
|
||||
#include "argv-array.h"
|
||||
#define MAX_ARGS 32
|
||||
|
||||
static const char *argv_exec_path;
|
||||
@ -105,32 +106,25 @@ void setup_path(void)
|
||||
strbuf_release(&new_path);
|
||||
}
|
||||
|
||||
const char **prepare_git_cmd(const char **argv)
|
||||
const char **prepare_git_cmd(struct argv_array *out, const char **argv)
|
||||
{
|
||||
int argc;
|
||||
const char **nargv;
|
||||
|
||||
for (argc = 0; argv[argc]; argc++)
|
||||
; /* just counting */
|
||||
nargv = xmalloc(sizeof(*nargv) * (argc + 2));
|
||||
|
||||
nargv[0] = "git";
|
||||
for (argc = 0; argv[argc]; argc++)
|
||||
nargv[argc + 1] = argv[argc];
|
||||
nargv[argc + 1] = NULL;
|
||||
return nargv;
|
||||
argv_array_push(out, "git");
|
||||
argv_array_pushv(out, argv);
|
||||
return out->argv;
|
||||
}
|
||||
|
||||
int execv_git_cmd(const char **argv) {
|
||||
const char **nargv = prepare_git_cmd(argv);
|
||||
trace_argv_printf(nargv, "trace: exec:");
|
||||
struct argv_array nargv = ARGV_ARRAY_INIT;
|
||||
|
||||
prepare_git_cmd(&nargv, argv);
|
||||
trace_argv_printf(nargv.argv, "trace: exec:");
|
||||
|
||||
/* execvp() can only ever return if it fails */
|
||||
sane_execvp("git", (char **)nargv);
|
||||
sane_execvp("git", (char **)nargv.argv);
|
||||
|
||||
trace_printf("trace: exec failed: %s\n", strerror(errno));
|
||||
|
||||
free(nargv);
|
||||
argv_array_clear(&nargv);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user