Commit 32f07984 by Patrick Steinhardt

diff_tform: fix potential NULL pointer access

The `normalize_find_opts` function in theory allows for the
incoming diff to have no repository. When the caller does not
pass in diff find options or if the GIT_DIFF_FIND_BY_CONFIG value
is set, though, we try to derive the configuration from the
diff's repository configuration without first verifying that the
repository is actually set to a non-NULL value.

Fix this issue by explicitly checking if the repository is set
and if it is not, fall back to a default value of
GIT_DIFF_FIND_RENAMES.
parent 3d1abc5a
...@@ -261,18 +261,23 @@ static int normalize_find_opts( ...@@ -261,18 +261,23 @@ static int normalize_find_opts(
if (!given || if (!given ||
(given->flags & GIT_DIFF_FIND_ALL) == GIT_DIFF_FIND_BY_CONFIG) (given->flags & GIT_DIFF_FIND_ALL) == GIT_DIFF_FIND_BY_CONFIG)
{ {
char *rule = if (diff->repo) {
git_config__get_string_force(cfg, "diff.renames", "true"); char *rule =
int boolval; git_config__get_string_force(cfg, "diff.renames", "true");
int boolval;
if (!git__parse_bool(&boolval, rule) && !boolval)
/* don't set FIND_RENAMES if bool value is false */; if (!git__parse_bool(&boolval, rule) && !boolval)
else if (!strcasecmp(rule, "copies") || !strcasecmp(rule, "copy")) /* don't set FIND_RENAMES if bool value is false */;
opts->flags |= GIT_DIFF_FIND_RENAMES | GIT_DIFF_FIND_COPIES; else if (!strcasecmp(rule, "copies") || !strcasecmp(rule, "copy"))
else opts->flags |= GIT_DIFF_FIND_RENAMES | GIT_DIFF_FIND_COPIES;
opts->flags |= GIT_DIFF_FIND_RENAMES; else
opts->flags |= GIT_DIFF_FIND_RENAMES;
git__free(rule); git__free(rule);
} else {
/* set default flag */
opts->flags |= GIT_DIFF_FIND_RENAMES;
}
} }
/* some flags imply others */ /* some flags imply others */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment