Commit 644c973fd54c375ee6a4a32aaffca1b02e5042cb

Carlos Martín Nieto 2018-05-22T15:21:08

path: accept the name length as a parameter We may take in names from the middle of a string so we want the caller to let us know how long the path component is that we should be checking.

diff --git a/src/path.c b/src/path.c
index 560cf86..816a359 100644
--- a/src/path.c
+++ b/src/path.c
@@ -1634,10 +1634,8 @@ GIT_INLINE(bool) only_spaces_and_dots(const char *path)
 	return true;
 }
 
-GIT_INLINE(bool) verify_dotgit_ntfs_generic(const char *name, const char *dotgit_name, const char *shortname_pfix)
+GIT_INLINE(bool) verify_dotgit_ntfs_generic(const char *name, size_t len, const char *dotgit_name, size_t dotgit_len, const char *shortname_pfix)
 {
-	size_t len = strlen(name);
-	size_t dotgit_len = strlen(dotgit_name);
 	int i, saw_tilde;
 
 	if (name[0] == '.' && len >= dotgit_len &&
@@ -1841,64 +1839,64 @@ int git_path_normalize_slashes(git_buf *out, const char *path)
 	return 0;
 }
 
-static int verify_dotgit_generic(const char *name, const char *dotgit_name, const char *shortname_pfix)
+static int verify_dotgit_generic(const char *name, size_t len, const char *dotgit_name, size_t dotgit_len, const char *shortname_pfix)
 {
-	if (!verify_dotgit_ntfs_generic(name, dotgit_name, shortname_pfix))
+	if (!verify_dotgit_ntfs_generic(name, len, dotgit_name, dotgit_len, shortname_pfix))
 		return false;
 
-	return verify_dotgit_hfs_generic(name, strlen(name), dotgit_name, strlen(dotgit_name));
+	return verify_dotgit_hfs_generic(name, len, dotgit_name, dotgit_len);
 }
 
-int git_path_is_ntfs_dotgit_modules(const char *name)
+int git_path_is_ntfs_dotgit_modules(const char *name, size_t len)
 {
-	return !verify_dotgit_ntfs_generic(name, "gitmodules", "gi7eba");
+	return !verify_dotgit_ntfs_generic(name, len, "gitmodules", CONST_STRLEN("gitmodules"), "gi7eba");
 }
 
-int git_path_is_hfs_dotgit_modules(const char *name)
+int git_path_is_hfs_dotgit_modules(const char *name, size_t len)
 {
-	return !verify_dotgit_hfs_generic(name, strlen(name), "gitmodules", CONST_STRLEN("gitmodules"));
+	return !verify_dotgit_hfs_generic(name, len, "gitmodules", CONST_STRLEN("gitmodules"));
 }
 
-int git_path_is_dotgit_modules(const char *name)
+int git_path_is_dotgit_modules(const char *name, size_t len)
 {
-	if (git_path_is_hfs_dotgit_modules(name))
+	if (git_path_is_hfs_dotgit_modules(name, len))
 		return 1;
 
-	return git_path_is_ntfs_dotgit_modules(name);
+	return git_path_is_ntfs_dotgit_modules(name, len);
 }
 
-int git_path_is_ntfs_dotgit_ignore(const char *name)
+int git_path_is_ntfs_dotgit_ignore(const char *name, size_t len)
 {
-	return !verify_dotgit_ntfs_generic(name, "gitignore", "gi250a");
+	return !verify_dotgit_ntfs_generic(name, len, "gitignore", CONST_STRLEN("gitignore"), "gi250a");
 }
 
-int git_path_is_hfs_dotgit_ignore(const char *name)
+int git_path_is_hfs_dotgit_ignore(const char *name, size_t len)
 {
-	return !verify_dotgit_hfs_generic(name, strlen(name), "gitignore", CONST_STRLEN("gitignore"));
+	return !verify_dotgit_hfs_generic(name, len, "gitignore", CONST_STRLEN("gitignore"));
 }
 
-int git_path_is_dotgit_ignore(const char *name)
+int git_path_is_dotgit_ignore(const char *name, size_t len)
 {
-	if (git_path_is_hfs_dotgit_ignore(name))
+	if (git_path_is_hfs_dotgit_ignore(name, len))
 		return 1;
 
-	return git_path_is_ntfs_dotgit_ignore(name);
+	return git_path_is_ntfs_dotgit_ignore(name, len);
 }
 
-int git_path_is_hfs_dotgit_attributes(const char *name)
+int git_path_is_hfs_dotgit_attributes(const char *name, size_t len)
 {
-	return !verify_dotgit_hfs_generic(name, strlen(name), "gitattributes", CONST_STRLEN("gitattributes"));
+	return !verify_dotgit_hfs_generic(name, len, "gitattributes", CONST_STRLEN("gitattributes"));
 }
 
-int git_path_is_ntfs_dotgit_attributes(const char *name)
+int git_path_is_ntfs_dotgit_attributes(const char *name, size_t len)
 {
-	return !verify_dotgit_ntfs_generic(name, "gitattributes", "gi7d29");
+	return !verify_dotgit_ntfs_generic(name, len, "gitattributes", CONST_STRLEN("gitattributes"), "gi7d29");
 }
 
-int git_path_is_dotgit_attributes(const char *name)
+int git_path_is_dotgit_attributes(const char *name, size_t len)
 {
-	if (git_path_is_hfs_dotgit_attributes(name))
+	if (git_path_is_hfs_dotgit_attributes(name, len))
 		return 1;
 
-	return git_path_is_ntfs_dotgit_attributes(name);
+	return git_path_is_ntfs_dotgit_attributes(name, len);
 }
diff --git a/src/path.h b/src/path.h
index 553608a..8609388 100644
--- a/src/path.h
+++ b/src/path.h
@@ -634,63 +634,72 @@ int git_path_normalize_slashes(git_buf *out, const char *path);
  * Check whether a path component corresponds to a .gitmodules file
  *
  * @param name the path component to check
+ * @param len the length of `name`
  */
-extern int git_path_is_dotgit_modules(const char *name);
+extern int git_path_is_dotgit_modules(const char *name, size_t len);
 
 /**
  * Check whether a path component corresponds to a .gitmodules file in NTFS
  *
  * @param name the path component to check
+ * @param len the length of `name`
  */
-extern int git_path_is_ntfs_dotgit_modules(const char *name);
+extern int git_path_is_ntfs_dotgit_modules(const char *name, size_t len);
 
 /**
  * Check whether a path component corresponds to a .gitmodules file in HFS+
  *
  * @param name the path component to check
+ * @param len the length of `name`
  */
-extern int git_path_is_hfs_dotgit_modules(const char *name);
+extern int git_path_is_hfs_dotgit_modules(const char *name, size_t len);
 
 /**
  * Check whether a path component corresponds to a .gitignore file
  *
  * @param name the path component to check
+ * @param len the length of `name`
  */
-extern int git_path_is_dotgit_ignore(const char *name);
+extern int git_path_is_dotgit_ignore(const char *name, size_t len);
 
 /**
  * Check whether a path component corresponds to a .gitignore file in NTFS
  *
  * @param name the path component to check
+ * @param len the length of `name`
  */
-extern int git_path_is_ntfs_dotgit_ignore(const char *name);
+extern int git_path_is_ntfs_dotgit_ignore(const char *name, size_t len);
 
 /**
  * Check whether a path component corresponds to a .gitignore file in HFS+
  *
  * @param name the path component to check
+ * @param len the length of `name`
  */
-extern int git_path_is_hfs_dotgit_ignore(const char *name);
+extern int git_path_is_hfs_dotgit_ignore(const char *name, size_t len);
 
 /**
  * Check whether a path component corresponds to a .gitignore file
  *
  * @param name the path component to check
+ * @param len the length of `name`
  */
-extern int git_path_is_dotgit_attributes(const char *name);
+extern int git_path_is_dotgit_attributes(const char *name, size_t len);
 
 /**
  * Check whether a path component corresponds to a .gitattributes file in NTFS
  *
  * @param name the path component to check
+ * @param len the length of `name`
  */
-extern int git_path_is_ntfs_dotgit_attributes(const char *name);
+extern int git_path_is_ntfs_dotgit_attributes(const char *name, size_t len);
 
 /**
  * Check whether a path component corresponds to a .gitattributes file in HFS+
  *
  * @param name the path component to check
+ * @param len the length of `name`
  */
-extern int git_path_is_hfs_dotgit_attributes(const char *name);
+extern int git_path_is_hfs_dotgit_attributes(const char *name, size_t len);
 
 #endif
diff --git a/tests/path/dotgit.c b/tests/path/dotgit.c
index 7a011d4..038e849 100644
--- a/tests/path/dotgit.c
+++ b/tests/path/dotgit.c
@@ -90,18 +90,18 @@ static char *gitmodules_not_altnames[] = {
 void test_path_dotgit__dotgit_modules(void)
 {
 	size_t i;
-	cl_assert_equal_i(1, git_path_is_dotgit_modules(".gitmodules"));
-	cl_assert_equal_i(1, git_path_is_dotgit_modules(".git\xe2\x80\x8cmodules"));
+	cl_assert_equal_i(1, git_path_is_dotgit_modules(".gitmodules", strlen(".gitmodules")));
+	cl_assert_equal_i(1, git_path_is_dotgit_modules(".git\xe2\x80\x8cmodules", strlen(".git\xe2\x80\x8cmodules")));
 
 	for (i = 0; i < ARRAY_SIZE(gitmodules_altnames); i++) {
 		const char *name = gitmodules_altnames[i];
-		if (!git_path_is_dotgit_modules(name))
+		if (!git_path_is_dotgit_modules(name, strlen(name)))
 			cl_fail(name);
 	}
 
 	for (i = 0; i < ARRAY_SIZE(gitmodules_not_altnames); i++) {
 		const char *name = gitmodules_not_altnames[i];
-		if (git_path_is_dotgit_modules(name))
+		if (git_path_is_dotgit_modules(name, strlen(name)))
 			cl_fail(name);
 	}