Commit 691776213947e59a3928aab09e97a64b65e990ab

Ben Straub 2012-11-29T14:07:50

Deploy git_config_backend version

diff --git a/src/config.c b/src/config.c
index 6347f7d..913108a 100644
--- a/src/config.c
+++ b/src/config.c
@@ -248,6 +248,18 @@ int git_config_open_level(
 	return 0;
 }
 
+static bool config_backend_has_valid_version(git_config_backend *backend)
+{
+	if (!backend)
+		return true;
+
+	if (backend->version > 0 && backend->version <= GIT_CONFIG_BACKEND_VERSION)
+		return true;
+
+	giterr_set(GITERR_INVALID, "Invalid version %d for git_config_backend", backend->version);
+	return false;
+}
+
 int git_config_add_backend(
 	git_config *cfg,
 	git_config_backend *file,
@@ -259,6 +271,9 @@ int git_config_add_backend(
 
 	assert(cfg && file);
 
+	if (!config_backend_has_valid_version(file))
+		return -1;
+
 	if ((result = file->open(file, level)) < 0)
 		return result;
 
diff --git a/src/config_file.c b/src/config_file.c
index 354a919..6e29832 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -545,10 +545,10 @@ int git_config_file__ondisk(git_config_backend **out, const char *path)
 {
 	diskfile_backend *backend;
 
-	backend = git__malloc(sizeof(diskfile_backend));
+	backend = git__calloc(1, sizeof(diskfile_backend));
 	GITERR_CHECK_ALLOC(backend);
 
-	memset(backend, 0x0, sizeof(diskfile_backend));
+	backend->parent.version = GIT_CONFIG_BACKEND_VERSION;
 
 	backend->file_path = git__strdup(path);
 	GITERR_CHECK_ALLOC(backend->file_path);
diff --git a/tests-clar/config/backend.c b/tests-clar/config/backend.c
new file mode 100644
index 0000000..1cf7702
--- /dev/null
+++ b/tests-clar/config/backend.c
@@ -0,0 +1,20 @@
+#include "clar_libgit2.h"
+
+void test_config_backend__checks_version(void)
+{
+	git_config *cfg;
+	git_config_backend backend = GIT_CONFIG_BACKEND_INIT;
+	backend.version = 1024;
+	const git_error *err;
+
+	cl_git_pass(git_config_new(&cfg));
+	cl_git_fail(git_config_add_backend(cfg, &backend, 0, false));
+	err = giterr_last();
+	cl_assert_equal_i(GITERR_INVALID, err->klass);
+
+	giterr_clear();
+	backend.version = 1024;
+	cl_git_fail(git_config_add_backend(cfg, &backend, 0, false));
+	err = giterr_last();
+	cl_assert_equal_i(GITERR_INVALID, err->klass);
+}