Commit af22dabb4366f8b2dd4acd5725a25e88842d6938

Russell Belfer 2013-09-05T12:01:17

GIT_MODE_TYPE should exclude setgid bits The GIT_MODE_TYPE macro was looking at all bits above the permissions, but it should really just look at the top bits so that it will give the right results for a setgid or setuid entry. Since we're now using these macros in the tests, this was causing a test failure on platforms that don't support setgid.

diff --git a/src/fileops.h b/src/fileops.h
index 142eb99..f214456 100644
--- a/src/fileops.h
+++ b/src/fileops.h
@@ -228,7 +228,8 @@ extern git_off_t git_futils_filesize(git_file fd);
 #define GIT_PERMS_FOR_WRITE(MODE)   (GIT_PERMS_EXECUTABLE(MODE) ? 0777 : 0666)
 
 #define GIT_MODE_PERMS_MASK			0777
-#define GIT_MODE_TYPE(MODE)			((MODE) & ~GIT_MODE_PERMS_MASK)
+#define GIT_MODE_TYPE_MASK			0170000
+#define GIT_MODE_TYPE(MODE)			((MODE) & GIT_MODE_TYPE_MASK)
 #define GIT_MODE_ISBLOB(MODE)		(GIT_MODE_TYPE(MODE) == GIT_MODE_TYPE(GIT_FILEMODE_BLOB))
 
 /**
diff --git a/tests-clar/repo/init.c b/tests-clar/repo/init.c
index d7f2524..43bd7af 100644
--- a/tests-clar/repo/init.c
+++ b/tests-clar/repo/init.c
@@ -418,12 +418,8 @@ static void assert_mode_seems_okay(
 		expect_setgid = false;
 	}
 
-	if (S_ISGID != 0) {
-		if (expect_setgid)
-			cl_assert((st.st_mode & S_ISGID) != 0);
-		else
-			cl_assert((st.st_mode & S_ISGID) == 0);
-	}
+	if (S_ISGID != 0)
+		cl_assert_equal_b(expect_setgid, (st.st_mode & S_ISGID) != 0);
 
 	cl_assert_equal_b(
 		GIT_PERMS_EXECUTABLE(expect_mode), GIT_PERMS_EXECUTABLE(st.st_mode));