Merge branch 'rm/strchrnul-not-strlen'
authorJunio C Hamano <gitster@pobox.com>
Tue, 18 Mar 2014 20:51:18 +0000 (13:51 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 18 Mar 2014 20:51:18 +0000 (13:51 -0700)
* rm/strchrnul-not-strlen:
use strchrnul() in place of strchr() and strlen()

1  2 
archive.c
cache-tree.c
diff.c
pretty.c
diff --combined archive.c
index 7d0976fe55b8ef7b9009d080f7c1c0651a05def7,d1962157c8865de32a59d6f364616758377ae560..3fc0fb2928f1007ec5d8763d9d3a9b88152059ad
+++ b/archive.c
@@@ -17,7 -17,6 +17,7 @@@ static char const * const archive_usage
  static const struct archiver **archivers;
  static int nr_archivers;
  static int alloc_archivers;
 +static int remote_allow_unreachable;
  
  void register_archiver(struct archiver *ar)
  {
@@@ -258,10 -257,10 +258,10 @@@ static void parse_treeish_arg(const cha
        unsigned char sha1[20];
  
        /* Remotes are only allowed to fetch actual refs */
 -      if (remote) {
 +      if (remote && !remote_allow_unreachable) {
                char *ref = NULL;
-               const char *colon = strchr(name, ':');
-               int refnamelen = colon ? colon - name : strlen(name);
+               const char *colon = strchrnul(name, ':');
+               int refnamelen = colon - name;
  
                if (!dwim_ref(name, refnamelen, sha1, &ref))
                        die("no such ref: %.*s", refnamelen, name);
@@@ -402,14 -401,6 +402,14 @@@ static int parse_archive_args(int argc
        return argc;
  }
  
 +static int git_default_archive_config(const char *var, const char *value,
 +                                    void *cb)
 +{
 +      if (!strcmp(var, "uploadarchive.allowunreachable"))
 +              remote_allow_unreachable = git_config_bool(var, value);
 +      return git_default_config(var, value, cb);
 +}
 +
  int write_archive(int argc, const char **argv, const char *prefix,
                  int setup_prefix, const char *name_hint, int remote)
  {
        if (setup_prefix && prefix == NULL)
                prefix = setup_git_directory_gently(&nongit);
  
 -      git_config(git_default_config, NULL);
 +      git_config(git_default_archive_config, NULL);
        init_tar_archiver();
        init_zip_archiver();
  
diff --combined cache-tree.c
index 587b35362f18b3e98cd9e201a2de37c1878e852b,2130f32e260c85f506d14ed9c22e6db978a17653..7fa524a11323621d24c352b0a1108ae953a60cf5
@@@ -75,7 -75,11 +75,7 @@@ static struct cache_tree_sub *find_subt
                return NULL;
  
        pos = -pos-1;
 -      if (it->subtree_alloc <= it->subtree_nr) {
 -              it->subtree_alloc = alloc_nr(it->subtree_alloc);
 -              it->down = xrealloc(it->down, it->subtree_alloc *
 -                                  sizeof(*it->down));
 -      }
 +      ALLOC_GROW(it->down, it->subtree_nr + 1, it->subtree_alloc);
        it->subtree_nr++;
  
        down = xmalloc(sizeof(*down) + pathlen + 1);
@@@ -117,11 -121,11 +117,11 @@@ void cache_tree_invalidate_path(struct 
  
        if (!it)
                return;
-       slash = strchr(path, '/');
+       slash = strchrnul(path, '/');
+       namelen = slash - path;
        it->entry_count = -1;
-       if (!slash) {
+       if (!*slash) {
                int pos;
-               namelen = strlen(path);
                pos = subtree_pos(it, path, namelen);
                if (0 <= pos) {
                        cache_tree_free(&it->down[pos]->cache_tree);
                }
                return;
        }
-       namelen = slash - path;
        down = find_subtree(it, path, namelen, 0);
        if (down)
                cache_tree_invalidate_path(down->cache_tree, slash + 1);
@@@ -551,18 -554,19 +550,18 @@@ static struct cache_tree *cache_tree_fi
                struct cache_tree_sub *sub;
  
                slash = strchrnul(path, '/');
 -              /* between path and slash is the name of the
 -               * subtree to look for.
 +              /*
 +               * Between path and slash is the name of the subtree
 +               * to look for.
                 */
                sub = find_subtree(it, path, slash - path, 0);
                if (!sub)
                        return NULL;
                it = sub->cache_tree;
 -              if (*slash)
 -                      while (*slash && *slash == '/')
 -                              slash++;
 -              if (!*slash)
 -                      return it; /* prefix ended with slashes */
 +
                path = slash;
 +              while (*path == '/')
 +                      path++;
        }
        return it;
  }
diff --combined diff.c
index 9ae8116fcab890872a725121f37f69a277271783,015895bba6165a207b167e843b865777a86088bd..e343191bdaba0dbf63a841a79287cbb5f56fc18a
--- 1/diff.c
--- 2/diff.c
+++ b/diff.c
@@@ -1361,7 -1361,11 +1361,7 @@@ static struct diffstat_file *diffstat_a
  {
        struct diffstat_file *x;
        x = xcalloc(sizeof (*x), 1);
 -      if (diffstat->nr == diffstat->alloc) {
 -              diffstat->alloc = alloc_nr(diffstat->alloc);
 -              diffstat->files = xrealloc(diffstat->files,
 -                              diffstat->alloc * sizeof(x));
 -      }
 +      ALLOC_GROW(diffstat->files, diffstat->nr + 1, diffstat->alloc);
        diffstat->files[diffstat->nr++] = x;
        if (name_b) {
                x->from_name = xstrdup(name_a);
@@@ -2841,9 -2845,8 +2841,9 @@@ static struct diff_tempfile *prepare_te
                remove_tempfile_installed = 1;
        }
  
 -      if (!one->sha1_valid ||
 -          reuse_worktree_file(name, one->sha1, 1)) {
 +      if (!S_ISGITLINK(one->mode) &&
 +          (!one->sha1_valid ||
 +           reuse_worktree_file(name, one->sha1, 1))) {
                struct stat st;
                if (lstat(name, &st) < 0) {
                        if (errno == ENOENT)
@@@ -3362,14 -3365,11 +3362,11 @@@ static int opt_arg(const char *arg, in
        if (c != '-')
                return 0;
        arg++;
-       eq = strchr(arg, '=');
-       if (eq)
-               len = eq - arg;
-       else
-               len = strlen(arg);
+       eq = strchrnul(arg, '=');
+       len = eq - arg;
        if (!len || strncmp(arg, arg_long, len))
                return 0;
-       if (eq) {
+       if (*eq) {
                int n;
                char *end;
                if (!isdigit(*++eq))
@@@ -3596,6 -3596,14 +3593,6 @@@ static int parse_diff_filter_opt(const 
        return 0;
  }
  
 -/* Used only by "diff-files" and "diff --no-index" */
 -void handle_deprecated_show_diff_q(struct diff_options *opt)
 -{
 -      warning("'diff -q' and 'diff-files -q' are deprecated.");
 -      warning("Use 'diff --diff-filter=d' instead to ignore deleted filepairs.");
 -      parse_diff_filter_opt("d", opt);
 -}
 -
  static void enable_patch_output(int *fmt) {
        *fmt &= ~DIFF_FORMAT_NO_OUTPUT;
        *fmt |= DIFF_FORMAT_PATCH;
@@@ -3954,7 -3962,11 +3951,7 @@@ struct diff_queue_struct diff_queued_di
  
  void diff_q(struct diff_queue_struct *queue, struct diff_filepair *dp)
  {
 -      if (queue->alloc <= queue->nr) {
 -              queue->alloc = alloc_nr(queue->alloc);
 -              queue->queue = xrealloc(queue->queue,
 -                                      sizeof(dp) * queue->alloc);
 -      }
 +      ALLOC_GROW(queue->queue, queue->nr + 1, queue->alloc);
        queue->queue[queue->nr++] = dp;
  }
  
@@@ -4682,38 -4694,6 +4679,38 @@@ static int diff_filespec_is_identical(s
        return !memcmp(one->data, two->data, one->size);
  }
  
 +static int diff_filespec_check_stat_unmatch(struct diff_filepair *p)
 +{
 +      if (p->done_skip_stat_unmatch)
 +              return p->skip_stat_unmatch_result;
 +
 +      p->done_skip_stat_unmatch = 1;
 +      p->skip_stat_unmatch_result = 0;
 +      /*
 +       * 1. Entries that come from stat info dirtiness
 +       *    always have both sides (iow, not create/delete),
 +       *    one side of the object name is unknown, with
 +       *    the same mode and size.  Keep the ones that
 +       *    do not match these criteria.  They have real
 +       *    differences.
 +       *
 +       * 2. At this point, the file is known to be modified,
 +       *    with the same mode and size, and the object
 +       *    name of one side is unknown.  Need to inspect
 +       *    the identical contents.
 +       */
 +      if (!DIFF_FILE_VALID(p->one) || /* (1) */
 +          !DIFF_FILE_VALID(p->two) ||
 +          (p->one->sha1_valid && p->two->sha1_valid) ||
 +          (p->one->mode != p->two->mode) ||
 +          diff_populate_filespec(p->one, 1) ||
 +          diff_populate_filespec(p->two, 1) ||
 +          (p->one->size != p->two->size) ||
 +          !diff_filespec_is_identical(p->one, p->two)) /* (2) */
 +              p->skip_stat_unmatch_result = 1;
 +      return p->skip_stat_unmatch_result;
 +}
 +
  static void diffcore_skip_stat_unmatch(struct diff_options *diffopt)
  {
        int i;
        for (i = 0; i < q->nr; i++) {
                struct diff_filepair *p = q->queue[i];
  
 -              /*
 -               * 1. Entries that come from stat info dirtiness
 -               *    always have both sides (iow, not create/delete),
 -               *    one side of the object name is unknown, with
 -               *    the same mode and size.  Keep the ones that
 -               *    do not match these criteria.  They have real
 -               *    differences.
 -               *
 -               * 2. At this point, the file is known to be modified,
 -               *    with the same mode and size, and the object
 -               *    name of one side is unknown.  Need to inspect
 -               *    the identical contents.
 -               */
 -              if (!DIFF_FILE_VALID(p->one) || /* (1) */
 -                  !DIFF_FILE_VALID(p->two) ||
 -                  (p->one->sha1_valid && p->two->sha1_valid) ||
 -                  (p->one->mode != p->two->mode) ||
 -                  diff_populate_filespec(p->one, 1) ||
 -                  diff_populate_filespec(p->two, 1) ||
 -                  (p->one->size != p->two->size) ||
 -                  !diff_filespec_is_identical(p->one, p->two)) /* (2) */
 +              if (diff_filespec_check_stat_unmatch(p))
                        diff_q(&outq, p);
                else {
                        /*
@@@ -4887,7 -4887,6 +4884,7 @@@ void diff_change(struct diff_options *o
                 unsigned old_dirty_submodule, unsigned new_dirty_submodule)
  {
        struct diff_filespec *one, *two;
 +      struct diff_filepair *p;
  
        if (S_ISGITLINK(old_mode) && S_ISGITLINK(new_mode) &&
            is_submodule_ignored(concatpath, options))
        fill_filespec(two, new_sha1, new_sha1_valid, new_mode);
        one->dirty_submodule = old_dirty_submodule;
        two->dirty_submodule = new_dirty_submodule;
 +      p = diff_queue(&diff_queued_diff, one, two);
  
 -      diff_queue(&diff_queued_diff, one, two);
 -      if (!DIFF_OPT_TST(options, DIFF_FROM_CONTENTS))
 -              DIFF_OPT_SET(options, HAS_CHANGES);
 +      if (DIFF_OPT_TST(options, DIFF_FROM_CONTENTS))
 +              return;
 +
 +      if (DIFF_OPT_TST(options, QUICK) && options->skip_stat_unmatch &&
 +          !diff_filespec_check_stat_unmatch(p))
 +              return;
 +
 +      DIFF_OPT_SET(options, HAS_CHANGES);
  }
  
  struct diff_filepair *diff_unmerge(struct diff_options *options, const char *path)
diff --combined pretty.c
index 6e266ddf2749ab1b2388f72e3a1101e98fa656cc,99ba8ae975c813ec4be46c5f43257f63c6b1950f..3c43db558aee43b0ea69c23c6611dcc9fae0661f
+++ b/pretty.c
@@@ -397,18 -397,12 +397,18 @@@ static const char *show_ident_date(cons
                                   enum date_mode mode)
  {
        unsigned long date = 0;
 -      int tz = 0;
 +      long tz = 0;
  
        if (ident->date_begin && ident->date_end)
                date = strtoul(ident->date_begin, NULL, 10);
 -      if (ident->tz_begin && ident->tz_end)
 -              tz = strtol(ident->tz_begin, NULL, 10);
 +      if (date_overflows(date))
 +              date = 0;
 +      else {
 +              if (ident->tz_begin && ident->tz_end)
 +                      tz = strtol(ident->tz_begin, NULL, 10);
 +              if (tz >= INT_MAX || tz <= INT_MIN)
 +                      tz = 0;
 +      }
        return show_date(date, tz, mode);
  }
  
@@@ -555,14 -549,13 +555,13 @@@ static char *get_header(const struct co
        const char *line = msg;
  
        while (line) {
-               const char *eol = strchr(line, '\n'), *next;
+               const char *eol = strchrnul(line, '\n'), *next;
  
                if (line == eol)
                        return NULL;
-               if (!eol) {
+               if (!*eol) {
                        warning("malformed commit (header is missing newline): %s",
                                sha1_to_hex(commit->object.sha1));
-                       eol = line + strlen(line);
                        next = NULL;
                } else
                        next = eol + 1;