Skip to content

Commit 3bf305c

Browse files
committed
Fix situation of missing colon in the --reference option
Instead of a segfault we will produce an error message.
1 parent 617b5bd commit 3bf305c

File tree

3 files changed

+20
-5
lines changed

3 files changed

+20
-5
lines changed

src/XCCDF_POLICY/xccdf_policy.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2309,13 +2309,17 @@ void xccdf_policy_set_reference_filter(struct xccdf_policy *policy, const char *
23092309
const char *uri = _find_reference_uri_by_key(benchmark, key);
23102310
if (!uri) {
23112311
oscap_seterr(OSCAP_EFAMILY_OSCAP, "Reference type '%s' isn't available in this benchmark", key);
2312-
free(reference_parameter_dup);
2313-
free(split);
2314-
return;
2312+
goto cleanup;
2313+
}
2314+
char *title = split[1];
2315+
if (!title) {
2316+
oscap_seterr(OSCAP_EFAMILY_OSCAP, "Reference identifier hasn't been provided");
2317+
goto cleanup;
23152318
}
23162319
policy->reference_filter.active = true;
23172320
policy->reference_filter.href = strdup(uri);
2318-
policy->reference_filter.title = strdup(split[1]);
2321+
policy->reference_filter.title = strdup(title);
2322+
cleanup:
23192323
free(split);
23202324
free(reference_parameter_dup);
23212325
}

tests/API/XCCDF/unittests/test_reference.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,10 @@ assert_exists 1 "//rule-result[@idref=\"$r3\"]/result[text()=\"pass\"]"
9595
assert_exists 1 "//rule-result[@idref=\"$r4\"]/result[text()=\"pass\"]"
9696
:> $stdout
9797
:> $result
98+
99+
# Tests that when a wrong '--reference' option with a valid name but missing
100+
# identifier is provided OpenSCAP prints an errror message.
101+
$OSCAP xccdf eval --results $result --profile $p1 --reference "animals" $ds > $stdout 2> $stderr || [[ $? -eq 1 ]]
102+
grep -q "The --reference argument needs to be in form NAME:IDENTIFIER, using a colon as a separator." $stderr
103+
:> $stdout
104+
:> $result

utils/oscap-xccdf.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,10 +637,14 @@ int app_evaluate_xccdf(const struct oscap_action *action)
637637
const char *rid = oscap_string_iterator_next(sit);
638638
xccdf_session_skip_rule(session, rid);
639639
}
640+
oscap_string_iterator_free(sit);
640641
if (action->reference) {
642+
if (strchr(action->reference, ':') == NULL) {
643+
fprintf(stderr, "The --reference argument needs to be in form NAME:IDENTIFIER, using a colon as a separator.\n");
644+
goto cleanup;
645+
}
641646
xccdf_session_set_reference_filter(session, action->reference);
642647
}
643-
oscap_string_iterator_free(sit);
644648

645649
if (xccdf_session_load(session) != 0)
646650
goto cleanup;

0 commit comments

Comments
 (0)