]> git.proxmox.com Git - libgit2.git/commitdiff
index: canonicalize inserted paths safely
authorEdward Thomson <ethomson@edwardthomson.com>
Thu, 3 Dec 2015 21:27:15 +0000 (16:27 -0500)
committerEdward Thomson <ethomson@edwardthomson.com>
Thu, 3 Dec 2015 21:27:15 +0000 (16:27 -0500)
When adding to the index, we look to see if a portion of the given
path matches a portion of a path in the index.  If so, we will use
the existing path information.  For example, when adding `foo/bar.c`,
if there is an index entry to `FOO/other` and the filesystem is case
insensitive, then we will put `bar.c` into the existing tree instead
of creating a new one with a different case.

Use `strncmp` to do that instead of `memcmp`.  When we `bsearch`
into the index, we locate the position where the new entry would
go.  The index entry at that position does not necessarily have
a relation to the entry we're adding, so we cannot make assumptions
and use `memcmp`.  Instead, compare them as strings.

When canonicalizing paths, we look for the first index entry that
matches a given substring.

src/index.c

index ca5b2c46eb7140278d0bfd5944b0482ee8fcc86e..391738e398c58bb856e068a90a107ffbe801b7cf 100644 (file)
@@ -1167,7 +1167,7 @@ static int canonicalize_directory_path(
                while ((match = git_vector_get(&index->entries, pos))) {
                        if (GIT_IDXENTRY_STAGE(match) != 0) {
                                /* conflicts do not contribute to canonical paths */
-                       } else if (memcmp(search, match->path, search_len) == 0) {
+                       } else if (strncmp(search, match->path, search_len) == 0) {
                                /* prefer an exact match to the input filename */
                                best = match;
                                best_len = search_len;