summaryrefslogtreecommitdiff
path: root/path.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2018-05-13 16:09:42 (GMT)
committerJeff King <peff@peff.net>2018-05-22 03:50:11 (GMT)
commit11a9f4d807a0d71dc6eff51bb87baf4ca2cccf1d (patch)
tree0ad3d6ce5353f8a5b6b4c1ccd27cea3742db2f7e /path.c
parent0383bbb9015898cbc79abd7b64316484d7713b44 (diff)
downloadgit-11a9f4d807a0d71dc6eff51bb87baf4ca2cccf1d.zip
git-11a9f4d807a0d71dc6eff51bb87baf4ca2cccf1d.tar.gz
git-11a9f4d807a0d71dc6eff51bb87baf4ca2cccf1d.tar.bz2
is_ntfs_dotgit: use a size_t for traversing string
We walk through the "name" string using an int, which can wrap to a negative value and cause us to read random memory before our array (e.g., by creating a tree with a name >2GB, since "int" is still 32 bits even on most 64-bit platforms). Worse, this is easy to trigger during the fsck_tree() check, which is supposed to be protecting us from malicious garbage. Note one bit of trickiness in the existing code: we sometimes assign -1 to "len" at the end of the loop, and then rely on the "len++" in the for-loop's increment to take it back to 0. This is still legal with a size_t, since assigning -1 will turn into SIZE_MAX, which then wraps around to 0 on increment. Signed-off-by: Jeff King <peff@peff.net>
Diffstat (limited to 'path.c')
-rw-r--r--path.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/path.c b/path.c
index 0349a0a..9018aa0 100644
--- a/path.c
+++ b/path.c
@@ -1224,7 +1224,7 @@ static int only_spaces_and_periods(const char *path, size_t len, size_t skip)
int is_ntfs_dotgit(const char *name)
{
- int len;
+ size_t len;
for (len = 0; ; len++)
if (!name[len] || name[len] == '\\' || is_dir_sep(name[len])) {