merge: fix NULL pointer dereference when merging nothing into void
[gitweb.git] / exec_cmd.c
index e85f0fd8d897f4823a7c765d6b6ef929a15ca679..9d5703a157fe8e9d8396e0771798e54dc5eea6eb 100644 (file)
@@ -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;
@@ -43,12 +44,10 @@ const char *git_extract_argv0_path(const char *argv0)
 
        if (!argv0 || !*argv0)
                return NULL;
-       slash = argv0 + strlen(argv0);
 
-       while (argv0 <= slash && !is_dir_sep(*slash))
-               slash--;
+       slash = find_last_dir_sep(argv0);
 
-       if (slash >= argv0) {
+       if (slash) {
                argv0_path = xstrndup(argv0, slash - argv0);
                return slash + 1;
        }
@@ -107,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;
 }