turn on strict object validation by default
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ec5a0d3..9c50f12 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -29,6 +29,11 @@ v0.23 + 1
* Rebases can now be performed purely in-memory, without touching the
repository's workdir.
+* When adding objects to the index, or when creating new tree or commit
+ objects, the inputs are validated to ensure that the dependent objects
+ exist and are of the correct type. This object validation can be
+ disabled with the GIT_OPT_ENABLE_STRICT_OBJECT_CREATION option.
+
### API additions
* `git_config_lock()` has been added, which allow for
diff --git a/src/object.c b/src/object.c
index e7c1fef..ebf77fb 100644
--- a/src/object.c
+++ b/src/object.c
@@ -14,7 +14,7 @@
#include "blob.h"
#include "tag.h"
-bool git_object__strict_input_validation = false;
+bool git_object__strict_input_validation = true;
typedef struct {
const char *str; /* type name string */
diff --git a/tests/commit/write.c b/tests/commit/write.c
index 303d1ce..96b7cc3 100644
--- a/tests/commit/write.c
+++ b/tests/commit/write.c
@@ -38,7 +38,7 @@ void test_commit_write__cleanup(void)
cl_git_sandbox_cleanup();
- cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, 0));
+ cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, 1));
}
@@ -196,10 +196,12 @@ static int create_commit_from_ids(
return ret;
}
-void test_commit_write__doesnt_validate_objects_by_default(void)
+void test_commit_write__can_write_invalid_objects(void)
{
git_oid expected_id, tree_id, parent_id, commit_id;
+ cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, 0));
+
/* this is a valid tree and parent */
git_oid_fromstr(&tree_id, tree_id_str);
git_oid_fromstr(&parent_id, parent_id_str);
@@ -237,8 +239,6 @@ void test_commit_write__can_validate_objects(void)
{
git_oid tree_id, parent_id, commit_id;
- cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, 1));
-
/* this is a valid tree and parent */
git_oid_fromstr(&tree_id, tree_id_str);
git_oid_fromstr(&parent_id, parent_id_str);
diff --git a/tests/index/add.c b/tests/index/add.c
index cfa81c4..f101ea2 100644
--- a/tests/index/add.c
+++ b/tests/index/add.c
@@ -20,7 +20,7 @@ void test_index_add__cleanup(void)
cl_git_sandbox_cleanup();
g_repo = NULL;
- cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, 0));
+ cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, 1));
}
static void test_add_entry(
@@ -42,7 +42,7 @@ static void test_add_entry(
void test_index_add__invalid_entries_succeeds_by_default(void)
{
/*
- * Ensure that there is no validation on ids by default
+ * Ensure that there is validation on object ids by default
*/
/* ensure that we can add some actually good entries */
@@ -51,34 +51,34 @@ void test_index_add__invalid_entries_succeeds_by_default(void)
test_add_entry(true, valid_blob_id, GIT_FILEMODE_LINK);
/* test that we fail to add some invalid (missing) blobs and trees */
- test_add_entry(true, invalid_id, GIT_FILEMODE_BLOB);
- test_add_entry(true, invalid_id, GIT_FILEMODE_BLOB_EXECUTABLE);
- test_add_entry(true, invalid_id, GIT_FILEMODE_LINK);
+ test_add_entry(false, invalid_id, GIT_FILEMODE_BLOB);
+ test_add_entry(false, invalid_id, GIT_FILEMODE_BLOB_EXECUTABLE);
+ test_add_entry(false, invalid_id, GIT_FILEMODE_LINK);
/* test that we validate the types of objects */
- test_add_entry(true, valid_commit_id, GIT_FILEMODE_BLOB);
- test_add_entry(true, valid_tree_id, GIT_FILEMODE_BLOB_EXECUTABLE);
- test_add_entry(true, valid_commit_id, GIT_FILEMODE_LINK);
+ test_add_entry(false, valid_commit_id, GIT_FILEMODE_BLOB);
+ test_add_entry(false, valid_tree_id, GIT_FILEMODE_BLOB_EXECUTABLE);
+ test_add_entry(false, valid_commit_id, GIT_FILEMODE_LINK);
/*
- * Ensure that strict object references will fail the `index_add`
+ * Ensure that there we can disable validation
*/
- cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, 1));
+ cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, 0));
/* ensure that we can add some actually good entries */
test_add_entry(true, valid_blob_id, GIT_FILEMODE_BLOB);
test_add_entry(true, valid_blob_id, GIT_FILEMODE_BLOB_EXECUTABLE);
test_add_entry(true, valid_blob_id, GIT_FILEMODE_LINK);
- /* test that we fail to add some invalid (missing) blobs and trees */
- test_add_entry(false, invalid_id, GIT_FILEMODE_BLOB);
- test_add_entry(false, invalid_id, GIT_FILEMODE_BLOB_EXECUTABLE);
- test_add_entry(false, invalid_id, GIT_FILEMODE_LINK);
+ /* test that we can now add some invalid (missing) blobs and trees */
+ test_add_entry(true, invalid_id, GIT_FILEMODE_BLOB);
+ test_add_entry(true, invalid_id, GIT_FILEMODE_BLOB_EXECUTABLE);
+ test_add_entry(true, invalid_id, GIT_FILEMODE_LINK);
- /* test that we validate the types of objects */
- test_add_entry(false, valid_commit_id, GIT_FILEMODE_BLOB);
- test_add_entry(false, valid_tree_id, GIT_FILEMODE_BLOB_EXECUTABLE);
- test_add_entry(false, valid_commit_id, GIT_FILEMODE_LINK);
+ /* test that we do not validate the types of objects */
+ test_add_entry(true, valid_commit_id, GIT_FILEMODE_BLOB);
+ test_add_entry(true, valid_tree_id, GIT_FILEMODE_BLOB_EXECUTABLE);
+ test_add_entry(true, valid_commit_id, GIT_FILEMODE_LINK);
}
diff --git a/tests/object/tree/write.c b/tests/object/tree/write.c
index f779b8c..341f5db 100644
--- a/tests/object/tree/write.c
+++ b/tests/object/tree/write.c
@@ -19,7 +19,7 @@ void test_object_tree_write__cleanup(void)
{
cl_git_sandbox_cleanup();
- cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, 0));
+ cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, 1));
}
void test_object_tree_write__from_memory(void)
@@ -492,11 +492,11 @@ static void test_invalid_objects(bool should_allow_invalid)
void test_object_tree_write__object_validity(void)
{
- /* Ensure that we can add invalid objects by default */
- test_invalid_objects(true);
-
- /* Ensure that we can turn on validation */
- cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, 1));
+ /* Ensure that we cannot add invalid objects by default */
test_invalid_objects(false);
+
+ /* Ensure that we can turn off validation */
+ cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, 0));
+ test_invalid_objects(true);
}