]> granicus.if.org Git - git/commitdiff
git: use COPY_ARRAY and MOVE_ARRAY in handle_alias()
authorRené Scharfe <l.s.r@web.de>
Thu, 19 Sep 2019 20:48:30 +0000 (22:48 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 20 Sep 2019 18:11:26 +0000 (11:11 -0700)
Use the macro COPY_ARRAY to copy array elements and MOVE_ARRAY to do the
same for moving them backwards in an array with potential overlap.  The
result is shorter and safer, as it infers the element type automatically
and does a (very) basic type compatibility check for its first two
arguments.

These cases were missed by Coccinelle and contrib/coccinelle/array.cocci
because the type of the elements is "const char *", not "char *", and
the rules in the semantic patch cautiously insist on the sizeof operator
being used on exactly the same type to avoid generating transformations
that introduce subtle bugs into tricky code.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git.c

diff --git a/git.c b/git.c
index c1ee7124edcfb0417539134d50212e997dc71c1f..ce6ab0ece2cc6dbf153946701eed446940c9d304 100644 (file)
--- a/git.c
+++ b/git.c
@@ -369,8 +369,7 @@ static int handle_alias(int *argcp, const char ***argv)
                        die(_("alias '%s' changes environment variables.\n"
                              "You can use '!git' in the alias to do this"),
                            alias_command);
-               memmove(new_argv - option_count, new_argv,
-                               count * sizeof(char *));
+               MOVE_ARRAY(new_argv - option_count, new_argv, count);
                new_argv -= option_count;
 
                if (count < 1)
@@ -385,7 +384,7 @@ static int handle_alias(int *argcp, const char ***argv)
 
                REALLOC_ARRAY(new_argv, count + *argcp);
                /* insert after command name */
-               memcpy(new_argv + count, *argv + 1, sizeof(char *) * *argcp);
+               COPY_ARRAY(new_argv + count, *argv + 1, *argcp);
 
                trace2_cmd_alias(alias_command, new_argv);
                trace2_cmd_list_config();