summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBen Straub <bs@github.com>2012-11-29 14:06:40 -0800
committerBen Straub <bs@github.com>2012-11-30 13:12:14 -0800
commitb81aa2f1deb98eb7f9e60ac96696e69a9a49d8f8 (patch)
treec9319fc7252b87c183dc6d7ed9296c0e48f50f5a /src
parentf4fc9fdba03dd4975229243d7c1debd00c9d1f18 (diff)
downloadlibgit2-b81aa2f1deb98eb7f9e60ac96696e69a9a49d8f8.tar.gz
Deploy GIT_CHECKOUT_OPTS_INIT
Diffstat (limited to 'src')
-rw-r--r--src/checkout.c22
-rw-r--r--src/reset.c3
-rw-r--r--src/stash.c4
3 files changed, 23 insertions, 6 deletions
diff --git a/src/checkout.c b/src/checkout.c
index a3166bfa5..2a7ad70be 100644
--- a/src/checkout.c
+++ b/src/checkout.c
@@ -225,10 +225,12 @@ static int retrieve_symlink_caps(git_repository *repo, bool *can_symlink)
static void normalize_options(
git_checkout_opts *normalized, git_checkout_opts *proposed)
{
+ git_checkout_opts init_opts = GIT_CHECKOUT_OPTS_INIT;
+
assert(normalized);
if (!proposed)
- memset(normalized, 0, sizeof(git_checkout_opts));
+ memmove(normalized, &init_opts, sizeof(git_checkout_opts));
else
memmove(normalized, proposed, sizeof(git_checkout_opts));
@@ -601,6 +603,19 @@ static int checkout_create_submodules(
return 0;
}
+static bool opts_is_valid_version(git_checkout_opts *opts)
+{
+ if (!opts)
+ return true;
+
+ if (opts->version > 0 && opts->version <= GIT_CHECKOUT_OPTS_VERSION)
+ return true;
+
+ giterr_set(GITERR_INVALID, "Invalid version %d on git_checkout_opts structure",
+ opts->version);
+ return false;
+}
+
int git_checkout_index(
git_repository *repo,
git_index *index,
@@ -624,6 +639,11 @@ int git_checkout_index(
GIT_DIFF_INCLUDE_UNMODIFIED | GIT_DIFF_INCLUDE_UNTRACKED |
GIT_DIFF_INCLUDE_TYPECHANGE | GIT_DIFF_SKIP_BINARY_CHECK;
+ if (!opts_is_valid_version(opts)) {
+ error = -1;
+ goto cleanup;
+ }
+
if (opts && opts->paths.count > 0)
diff_opts.pathspec = opts->paths;
diff --git a/src/reset.c b/src/reset.c
index d410a8806..17b4b900c 100644
--- a/src/reset.c
+++ b/src/reset.c
@@ -69,7 +69,7 @@ int git_reset(
git_index *index = NULL;
git_tree *tree = NULL;
int error = -1;
- git_checkout_opts opts;
+ git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
assert(repo && target);
assert(reset_type == GIT_RESET_SOFT
@@ -136,7 +136,6 @@ int git_reset(
goto cleanup;
}
- memset(&opts, 0, sizeof(opts));
opts.checkout_strategy = GIT_CHECKOUT_FORCE;
if (git_checkout_index(repo, NULL, &opts) < 0) {
diff --git a/src/stash.c b/src/stash.c
index 107cbe3ca..edd8c55db 100644
--- a/src/stash.c
+++ b/src/stash.c
@@ -498,9 +498,7 @@ static int reset_index_and_workdir(
git_commit *commit,
bool remove_untracked)
{
- git_checkout_opts opts;
-
- memset(&opts, 0, sizeof(git_checkout_opts));
+ git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
opts.checkout_strategy =
GIT_CHECKOUT_UPDATE_MODIFIED | GIT_CHECKOUT_UPDATE_UNTRACKED;