|
Packit Service |
569379 |
/*
|
|
Packit Service |
569379 |
* Copyright 2020 Red Hat Inc., Durham, North Carolina.
|
|
Packit Service |
569379 |
* All Rights Reserved.
|
|
Packit Service |
569379 |
*
|
|
Packit Service |
569379 |
* This library is free software; you can redistribute it and/or
|
|
Packit Service |
569379 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit Service |
569379 |
* License as published by the Free Software Foundation; either
|
|
Packit Service |
569379 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit Service |
569379 |
*
|
|
Packit Service |
569379 |
* This library is distributed in the hope that it will be useful,
|
|
Packit Service |
569379 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
569379 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
569379 |
* Lesser General Public License for more details.
|
|
Packit Service |
569379 |
*
|
|
Packit Service |
569379 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit Service |
569379 |
* License along with this library; if not, write to the Free Software
|
|
Packit Service |
569379 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit Service |
569379 |
*
|
|
Packit Service |
569379 |
* Authors:
|
|
Packit Service |
569379 |
* Jan Černý <jcerny@redhat.com>
|
|
Packit Service |
569379 |
*/
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
569379 |
#include <config.h>
|
|
Packit Service |
569379 |
#endif
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
#include <math.h>
|
|
Packit Service |
569379 |
#include <errno.h>
|
|
Packit Service |
569379 |
#include <pcre.h>
|
|
Packit Service |
569379 |
#include <yaml.h>
|
|
Packit Service |
569379 |
#include <yaml-path.h>
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
#include "yamlfilecontent_probe.h"
|
|
Packit Service |
569379 |
#include "sexp-manip.h"
|
|
Packit Service |
569379 |
#include "debug_priv.h"
|
|
Packit Service |
569379 |
#include "oval_fts.h"
|
|
Packit Service |
569379 |
#include "list.h"
|
|
Packit Service |
569379 |
#include "probe/probe.h"
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
#define OSCAP_YAML_STRING_TAG "tag:yaml.org,2002:str"
|
|
Packit Service |
569379 |
#define OSCAP_YAML_BOOL_TAG "tag:yaml.org,2002:bool"
|
|
Packit Service |
569379 |
#define OSCAP_YAML_FLOAT_TAG "tag:yaml.org,2002:float"
|
|
Packit Service |
569379 |
#define OSCAP_YAML_INT_TAG "tag:yaml.org,2002:int"
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
#define OVECCOUNT 30 /* should be a multiple of 3 */
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
int yamlfilecontent_probe_offline_mode_supported()
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
return PROBE_OFFLINE_OWN;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
static bool match_regex(const char *pattern, const char *value)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
const char *errptr;
|
|
Packit Service |
569379 |
int erroroffset;
|
|
Packit Service |
569379 |
pcre *re = pcre_compile(pattern, 0, &errptr, &erroroffset, NULL);
|
|
Packit Service |
569379 |
if (re == NULL) {
|
|
Packit Service |
569379 |
dE("pcre_compile failed on pattern '%s': %s at %d", pattern,
|
|
Packit Service |
569379 |
errptr, erroroffset);
|
|
Packit Service |
569379 |
return false;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
int ovector[OVECCOUNT];
|
|
Packit Service |
569379 |
int rc = pcre_exec(re, NULL, value, strlen(value), 0, 0, ovector, OVECCOUNT);
|
|
Packit Service |
569379 |
if (rc > 0) {
|
|
Packit Service |
569379 |
return true;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
return false;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
static SEXP_t *yaml_scalar_event_to_sexp(yaml_event_t *event)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
char *tag = (char *) event->data.scalar.tag;
|
|
Packit Service |
569379 |
char *value = (char *) event->data.scalar.value;
|
|
Packit Service |
569379 |
|
|
Packit Service |
065952 |
/* Nodes lacking an explicit tag are given a non-specific tag:
|
|
Packit Service |
569379 |
* “!” for non-plain scalars, and “?” for all other nodes
|
|
Packit Service |
569379 |
*/
|
|
Packit Service |
569379 |
if (tag == NULL) {
|
|
Packit Service |
569379 |
if (event->data.scalar.style != YAML_PLAIN_SCALAR_STYLE) {
|
|
Packit Service |
569379 |
tag = "!";
|
|
Packit Service |
569379 |
} else {
|
|
Packit Service |
569379 |
tag = "?";
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
/* Nodes with "!" tag can be sequences, maps or strings, but we process
|
|
Packit Service |
569379 |
* only scalars in this functions, so they can only be strings. */
|
|
Packit Service |
569379 |
if (!strcmp(tag, "!")) {
|
|
Packit Service |
569379 |
tag = OSCAP_YAML_STRING_TAG;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
bool question = !strcmp(tag, "?");
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
/* Regular expressions based on https://yaml.org/spec/1.2/spec.html#id2804923 */
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
if (question || !strcmp(tag, OSCAP_YAML_BOOL_TAG)) {
|
|
Packit Service |
569379 |
if (match_regex("^(true|True|TRUE)$", value)) {
|
|
Packit Service |
569379 |
return SEXP_number_newb(true);
|
|
Packit Service |
569379 |
} else if (match_regex("^(false|False|FALSE)$", value)) {
|
|
Packit Service |
569379 |
return SEXP_number_newb(false);
|
|
Packit Service |
569379 |
} else if (!question) {
|
|
Packit Service |
569379 |
return NULL;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
if (question || !strcmp(tag, OSCAP_YAML_INT_TAG)) {
|
|
Packit Service |
569379 |
if (match_regex("^[+-]?[0-9]+$", value)) {
|
|
Packit Service |
569379 |
int int_value = strtol(value, NULL, 10);
|
|
Packit Service |
569379 |
return SEXP_number_newi(int_value);
|
|
Packit Service |
569379 |
} else if (match_regex("^0o[0-7]+$", value)) {
|
|
Packit Service |
569379 |
/* strtol doesn't understand 0o as octal prefix, it wants 0 */
|
|
Packit Service |
569379 |
int int_value = strtol(value + 2, NULL, 8);
|
|
Packit Service |
569379 |
return SEXP_number_newi(int_value);
|
|
Packit Service |
569379 |
} else if (match_regex("^0x[0-9a-fA-F]+$", value)) {
|
|
Packit Service |
569379 |
int int_value = strtol(value, NULL, 16);
|
|
Packit Service |
569379 |
return SEXP_number_newi(int_value);
|
|
Packit Service |
569379 |
} else if (!question) {
|
|
Packit Service |
569379 |
return NULL;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
if (question || !strcmp(tag, OSCAP_YAML_FLOAT_TAG)) {
|
|
Packit Service |
569379 |
if (match_regex("^[-+]?(\\.[0-9]+|[0-9]+(\\.[0-9]*)?)([eE][-+]?[0-9]+)?$", value)) {
|
|
Packit Service |
569379 |
double double_value = strtod(value, NULL);
|
|
Packit Service |
569379 |
return SEXP_number_newf(double_value);
|
|
Packit Service |
569379 |
} else if (match_regex("^[-+]?(\\.inf|\\.Inf|\\.INF)$", value)) {
|
|
Packit Service |
569379 |
double double_value = INFINITY;
|
|
Packit Service |
569379 |
if (value[0] == '-') {
|
|
Packit Service |
569379 |
double_value = -INFINITY;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
return SEXP_number_newf(double_value);
|
|
Packit Service |
569379 |
} else if (match_regex("^(\\.nan|\\.NaN|\\.NAN)$", value)) {
|
|
Packit Service |
569379 |
double double_value = NAN;
|
|
Packit Service |
569379 |
return SEXP_number_newf(double_value);
|
|
Packit Service |
569379 |
} else if (!question) {
|
|
Packit Service |
569379 |
return NULL;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
return SEXP_string_new(value, strlen(value));
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
065952 |
static char *escape_key(char *key)
|
|
Packit Service |
065952 |
{
|
|
Packit Service |
065952 |
if (key == NULL)
|
|
Packit Service |
065952 |
return NULL;
|
|
Packit Service |
065952 |
|
|
Packit Service |
065952 |
size_t cap_letters = 0;
|
|
Packit Service |
065952 |
size_t key_len = strlen(key);
|
|
Packit Service |
065952 |
for (size_t i = 0; i < key_len; i++)
|
|
Packit Service |
065952 |
if ((key[i] >= 'A' && key[i] <= 'Z') || key[i] == '^')
|
|
Packit Service |
065952 |
cap_letters++;
|
|
Packit Service |
065952 |
|
|
Packit Service |
065952 |
if (cap_letters == 0)
|
|
Packit Service |
065952 |
return key;
|
|
Packit Service |
065952 |
|
|
Packit Service |
065952 |
char *new_key = realloc(key, key_len + 1 + cap_letters);
|
|
Packit Service |
065952 |
if (new_key == NULL)
|
|
Packit Service |
065952 |
return key;
|
|
Packit Service |
065952 |
new_key[key_len + cap_letters] = '\0';
|
|
Packit Service |
065952 |
|
|
Packit Service |
065952 |
for (ssize_t i = key_len; i >= 0; i--) {
|
|
Packit Service |
065952 |
if ((new_key[i] >= 'A' && new_key[i] <= 'Z') || new_key[i] == '^') {
|
|
Packit Service |
065952 |
if (new_key[i] != '^')
|
|
Packit Service |
065952 |
new_key[i] += 32;
|
|
Packit Service |
065952 |
memmove(new_key + i + cap_letters, new_key + i, key_len - i);
|
|
Packit Service |
065952 |
new_key[i + cap_letters - 1] = '^';
|
|
Packit Service |
065952 |
cap_letters--;
|
|
Packit Service |
065952 |
key_len = i;
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
|
|
Packit Service |
065952 |
return new_key;
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
|
|
Packit Service |
065952 |
#define result_error(fmt, args...) \
|
|
Packit Service |
065952 |
do { \
|
|
Packit Service |
065952 |
SEXP_t *msg = probe_msg_creatf(OVAL_MESSAGE_LEVEL_ERROR, fmt, args); \
|
|
Packit Service |
065952 |
probe_cobj_add_msg(probe_ctx_getresult(ctx), msg); \
|
|
Packit Service |
065952 |
SEXP_free(msg); \
|
|
Packit Service |
065952 |
probe_cobj_set_flag(probe_ctx_getresult(ctx), SYSCHAR_FLAG_ERROR); \
|
|
Packit Service |
065952 |
ret = -1; \
|
|
Packit Service |
065952 |
} while (0)
|
|
Packit Service |
065952 |
|
|
Packit Service |
569379 |
static int yaml_path_query(const char *filepath, const char *yaml_path_cstr, struct oscap_list *values, probe_ctx *ctx)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
int ret = 0;
|
|
Packit Service |
569379 |
FILE *yaml_file = fopen(filepath, "r");
|
|
Packit Service |
569379 |
if (yaml_file == NULL) {
|
|
Packit Service |
065952 |
result_error("Unable to open file '%s': %s", filepath, strerror(errno));
|
|
Packit Service |
065952 |
return ret;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
yaml_path_t *yaml_path = yaml_path_create();
|
|
Packit Service |
569379 |
if (yaml_path_parse(yaml_path, (char *) yaml_path_cstr)) {
|
|
Packit Service |
065952 |
result_error("Invalid YAML path '%s': %s", yaml_path_cstr, yaml_path_error_get(yaml_path)->message);
|
|
Packit Service |
dbffd5 |
yaml_path_destroy(yaml_path);
|
|
Packit Service |
569379 |
fclose(yaml_file);
|
|
Packit Service |
065952 |
return ret;
|
|
Packit Service |
569379 |
};
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
yaml_parser_t parser;
|
|
Packit Service |
569379 |
yaml_parser_initialize(&parser);
|
|
Packit Service |
569379 |
yaml_parser_set_input_file(&parser, yaml_file);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
yaml_event_t event;
|
|
Packit Service |
569379 |
yaml_event_type_t event_type;
|
|
Packit Service |
569379 |
bool sequence = false;
|
|
Packit Service |
065952 |
bool mapping = false;
|
|
Packit Service |
065952 |
int index = 0;
|
|
Packit Service |
065952 |
char *key = strdup("#");
|
|
Packit Service |
065952 |
|
|
Packit Service |
065952 |
struct oscap_htable *record = NULL;
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
do {
|
|
Packit Service |
569379 |
if (!yaml_parser_parse(&parser, &event)) {
|
|
Packit Service |
065952 |
result_error("YAML parser error: %s", parser.problem);
|
|
Packit Service |
569379 |
goto cleanup;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
065952 |
if (yaml_path_filter_event(yaml_path, &parser, &event) == YAML_PATH_FILTER_RESULT_OUT) {
|
|
Packit Service |
569379 |
goto next;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
065952 |
|
|
Packit Service |
065952 |
event_type = event.type;
|
|
Packit Service |
065952 |
|
|
Packit Service |
569379 |
if (sequence) {
|
|
Packit Service |
569379 |
if (event_type == YAML_SEQUENCE_END_EVENT) {
|
|
Packit Service |
569379 |
sequence = false;
|
|
Packit Service |
065952 |
} else if (event_type == YAML_SEQUENCE_START_EVENT) {
|
|
Packit Service |
065952 |
result_error("YAML path '%s' points to a multi-dimensional structure (sequence containing another sequence)", yaml_path_cstr);
|
|
Packit Service |
569379 |
goto cleanup;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
} else {
|
|
Packit Service |
569379 |
if (event_type == YAML_SEQUENCE_START_EVENT) {
|
|
Packit Service |
569379 |
sequence = true;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
|
|
Packit Service |
065952 |
if (mapping) {
|
|
Packit Service |
065952 |
if (event_type == YAML_MAPPING_END_EVENT) {
|
|
Packit Service |
065952 |
mapping = false;
|
|
Packit Service |
065952 |
if (record->itemcount > 0) {
|
|
Packit Service |
065952 |
oscap_list_add(values, record);
|
|
Packit Service |
065952 |
} else {
|
|
Packit Service |
065952 |
// Do not collect empty records
|
|
Packit Service |
065952 |
oscap_htable_free0(record);
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
record = NULL;
|
|
Packit Service |
065952 |
} else if (event_type == YAML_MAPPING_START_EVENT) {
|
|
Packit Service |
065952 |
result_error("YAML path '%s' points to a multi-dimensional structure (map containing another map)", yaml_path_cstr);
|
|
Packit Service |
569379 |
goto cleanup;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
065952 |
} else {
|
|
Packit Service |
065952 |
if (event_type == YAML_MAPPING_START_EVENT) {
|
|
Packit Service |
065952 |
if (record) {
|
|
Packit Service |
065952 |
result_error("YAML path '%s' points to an invalid structure (map containing another map)", yaml_path_cstr);
|
|
Packit Service |
065952 |
goto cleanup;
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
mapping = true;
|
|
Packit Service |
065952 |
sequence = false;
|
|
Packit Service |
065952 |
index = 0;
|
|
Packit Service |
065952 |
record = oscap_htable_new();
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
065952 |
|
|
Packit Service |
569379 |
if (event_type == YAML_SCALAR_EVENT) {
|
|
Packit Service |
065952 |
if (mapping) {
|
|
Packit Service |
065952 |
if (!sequence) {
|
|
Packit Service |
065952 |
if (index++ % 2 == 0) {
|
|
Packit Service |
065952 |
free(key);
|
|
Packit Service |
065952 |
key = escape_key(strdup((const char *) event.data.scalar.value));
|
|
Packit Service |
065952 |
goto next;
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
|
|
Packit Service |
569379 |
SEXP_t *sexp = yaml_scalar_event_to_sexp(&event);
|
|
Packit Service |
569379 |
if (sexp == NULL) {
|
|
Packit Service |
065952 |
result_error("Can't convert '%s %s' to SEXP", event.data.scalar.tag, event.data.scalar.value);
|
|
Packit Service |
569379 |
goto cleanup;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
065952 |
|
|
Packit Service |
065952 |
if (!record)
|
|
Packit Service |
065952 |
record = oscap_htable_new();
|
|
Packit Service |
065952 |
struct oscap_list *field = oscap_htable_get(record, key);
|
|
Packit Service |
065952 |
if (!field) {
|
|
Packit Service |
065952 |
field = oscap_list_new();
|
|
Packit Service |
065952 |
oscap_htable_add(record, key, field);
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
|
|
Packit Service |
065952 |
oscap_list_add(field, sexp);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
next:
|
|
Packit Service |
569379 |
yaml_event_delete(&event);
|
|
Packit Service |
569379 |
} while (event_type != YAML_STREAM_END_EVENT);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
cleanup:
|
|
Packit Service |
065952 |
if (record)
|
|
Packit Service |
065952 |
oscap_list_add(values, record);
|
|
Packit Service |
065952 |
free(key);
|
|
Packit Service |
569379 |
yaml_parser_delete(&parser);
|
|
Packit Service |
569379 |
yaml_path_destroy(yaml_path);
|
|
Packit Service |
569379 |
fclose(yaml_file);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
return ret;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
065952 |
static void record_free(struct oscap_list *items)
|
|
Packit Service |
065952 |
{
|
|
Packit Service |
065952 |
oscap_list_free(items, (oscap_destruct_func) SEXP_free);
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
|
|
Packit Service |
065952 |
static void values_free(struct oscap_htable *record)
|
|
Packit Service |
065952 |
{
|
|
Packit Service |
065952 |
oscap_htable_free(record, (oscap_destruct_func) record_free);
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
|
|
Packit Service |
569379 |
static int process_yaml_file(const char *prefix, const char *path, const char *filename, const char *yamlpath, probe_ctx *ctx)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
int ret = 0;
|
|
Packit Service |
569379 |
char *filepath = oscap_path_join(path, filename);
|
|
Packit Service |
569379 |
struct oscap_list *values = oscap_list_new();
|
|
Packit Service |
569379 |
char *filepath_with_prefix = oscap_path_join(prefix, filepath);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
if (yaml_path_query(filepath_with_prefix, yamlpath, values, ctx)) {
|
|
Packit Service |
569379 |
ret = -1;
|
|
Packit Service |
569379 |
goto cleanup;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
struct oscap_iterator *values_it = oscap_iterator_new(values);
|
|
Packit Service |
569379 |
if (oscap_iterator_has_more(values_it)) {
|
|
Packit Service |
569379 |
SEXP_t *item = probe_item_create(
|
|
Packit Service |
569379 |
OVAL_INDEPENDENT_YAML_FILE_CONTENT,
|
|
Packit Service |
569379 |
NULL,
|
|
Packit Service |
569379 |
"filepath", OVAL_DATATYPE_STRING, filepath,
|
|
Packit Service |
569379 |
"path", OVAL_DATATYPE_STRING, path,
|
|
Packit Service |
569379 |
"filename", OVAL_DATATYPE_STRING, filename,
|
|
Packit Service |
569379 |
"yamlpath", OVAL_DATATYPE_STRING, yamlpath,
|
|
Packit Service |
065952 |
// TODO: Implement "windows_view",
|
|
Packit Service |
569379 |
NULL
|
|
Packit Service |
569379 |
);
|
|
Packit Service |
569379 |
while (oscap_iterator_has_more(values_it)) {
|
|
Packit Service |
065952 |
SEXP_t *result_ent = probe_ent_creat1("value", NULL, NULL);
|
|
Packit Service |
065952 |
probe_ent_setdatatype(result_ent, OVAL_DATATYPE_RECORD);
|
|
Packit Service |
065952 |
struct oscap_htable *record = oscap_iterator_next(values_it);
|
|
Packit Service |
065952 |
struct oscap_htable_iterator *record_it = oscap_htable_iterator_new(record);
|
|
Packit Service |
065952 |
while(oscap_htable_iterator_has_more(record_it)) {
|
|
Packit Service |
065952 |
const struct oscap_htable_item *record_item = oscap_htable_iterator_next(record_it);
|
|
Packit Service |
065952 |
struct oscap_iterator *item_value_it = oscap_iterator_new(record_item->value);
|
|
Packit Service |
065952 |
SEXP_t se_tmp_mem;
|
|
Packit Service |
065952 |
SEXP_t *key = SEXP_string_new_r(&se_tmp_mem, record_item->key, strlen(record_item->key));
|
|
Packit Service |
065952 |
while(oscap_iterator_has_more(item_value_it)) {
|
|
Packit Service |
065952 |
SEXP_t *value_sexp = oscap_iterator_next(item_value_it);
|
|
Packit Service |
065952 |
SEXP_t *field = probe_ent_creat1("field", NULL, value_sexp);
|
|
Packit Service |
065952 |
probe_item_attr_add(field, "name", key);
|
|
Packit Service |
065952 |
SEXP_list_add(result_ent, field);
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
oscap_iterator_free(item_value_it);
|
|
Packit Service |
065952 |
SEXP_free_r(&se_tmp_mem);
|
|
Packit Service |
065952 |
}
|
|
Packit Service |
065952 |
oscap_htable_iterator_free(record_it);
|
|
Packit Service |
065952 |
SEXP_list_add(item, result_ent);
|
|
Packit Service |
065952 |
SEXP_free(result_ent);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
probe_item_collect(ctx, item);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
oscap_iterator_free(values_it);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
cleanup:
|
|
Packit Service |
065952 |
oscap_list_free(values, (oscap_destruct_func) values_free);
|
|
Packit Service |
569379 |
free(filepath_with_prefix);
|
|
Packit Service |
569379 |
free(filepath);
|
|
Packit Service |
569379 |
return ret;
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
int yamlfilecontent_probe_main(probe_ctx *ctx, void *arg)
|
|
Packit Service |
569379 |
{
|
|
Packit Service |
569379 |
SEXP_t *probe_in = probe_ctx_getobject(ctx);
|
|
Packit Service |
569379 |
SEXP_t *behaviors_ent = probe_obj_getent(probe_in, "behaviors", 1);
|
|
Packit Service |
569379 |
SEXP_t *filepath_ent = probe_obj_getent(probe_in, "filepath", 1);
|
|
Packit Service |
569379 |
SEXP_t *path_ent = probe_obj_getent(probe_in, "path", 1);
|
|
Packit Service |
569379 |
SEXP_t *filename_ent = probe_obj_getent(probe_in, "filename", 1);
|
|
Packit Service |
569379 |
SEXP_t *yamlpath_ent = probe_obj_getent(probe_in, "yamlpath", 1);
|
|
Packit Service |
569379 |
SEXP_t *yamlpath_val = probe_ent_getval(yamlpath_ent);
|
|
Packit Service |
569379 |
char *yamlpath_str = SEXP_string_cstr(yamlpath_val);
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
probe_filebehaviors_canonicalize(&behaviors_ent);
|
|
Packit Service |
569379 |
const char *prefix = getenv("OSCAP_PROBE_ROOT");
|
|
Packit Service |
569379 |
OVAL_FTS *ofts = oval_fts_open_prefixed(
|
|
Packit Service |
569379 |
prefix, path_ent, filename_ent, filepath_ent, behaviors_ent,
|
|
Packit Service |
569379 |
probe_ctx_getresult(ctx));
|
|
Packit Service |
569379 |
if (ofts != NULL) {
|
|
Packit Service |
569379 |
OVAL_FTSENT *ofts_ent;
|
|
Packit Service |
569379 |
while ((ofts_ent = oval_fts_read(ofts)) != NULL) {
|
|
Packit Service |
569379 |
if (ofts_ent->fts_info == FTS_F
|
|
Packit Service |
569379 |
|| ofts_ent->fts_info == FTS_SL) {
|
|
Packit Service |
569379 |
process_yaml_file(prefix, ofts_ent->path, ofts_ent->file,
|
|
Packit Service |
569379 |
yamlpath_str, ctx);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
oval_ftsent_free(ofts_ent);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
oval_fts_close(ofts);
|
|
Packit Service |
569379 |
}
|
|
Packit Service |
569379 |
|
|
Packit Service |
569379 |
free(yamlpath_str);
|
|
Packit Service |
569379 |
SEXP_free(yamlpath_val);
|
|
Packit Service |
569379 |
SEXP_free(yamlpath_ent);
|
|
Packit Service |
569379 |
SEXP_free(filename_ent);
|
|
Packit Service |
569379 |
SEXP_free(path_ent);
|
|
Packit Service |
569379 |
SEXP_free(filepath_ent);
|
|
Packit Service |
569379 |
SEXP_free(behaviors_ent);
|
|
Packit Service |
569379 |
return 0;
|
|
Packit Service |
569379 |
}
|