import augeas-1.12.0-2.el8

This commit is contained in:
CentOS Sources 2019-11-05 15:54:18 -05:00 committed by Andrew Lukoshko
parent 9222ef1528
commit a783532a84
19 changed files with 12 additions and 1519 deletions

View File

@ -1 +1 @@
3cfa4870fac3b6697e8039cb611cb0c5a75498a4 SOURCES/augeas-1.10.1.tar.gz
afe7aee292e058141d8c19f6a82b5f8bae2d5163 SOURCES/augeas-1.12.0.tar.gz

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/augeas-1.10.1.tar.gz
SOURCES/augeas-1.12.0.tar.gz

View File

@ -1,53 +0,0 @@
From 0cfb9fc93b4cd967c9f8bb2f50df5ccff84a497e Mon Sep 17 00:00:00 2001
From: Han Han <hhan@redhat.com>
Date: Mon, 9 Apr 2018 15:59:45 +0800
Subject: [PATCH] Fix several memory leak in augmatch
(cherry picked from commit 46a62a71553c6bac8f61ecc2a33f65b13e7ad2c0)
---
src/augmatch.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/augmatch.c b/src/augmatch.c
index 20045c5f..1ac9b680 100644
--- a/src/augmatch.c
+++ b/src/augmatch.c
@@ -131,6 +131,7 @@ static void check_load_error(struct augeas *aug, const char *file) {
const char *msg, *line, *col;
aug_defvar(aug, "info", info);
+ free(info);
die(aug_ns_count(aug, "info") == 0, "file %s does not exist\n", file);
aug_defvar(aug, "error", "$info/error");
@@ -240,7 +241,7 @@ static void print_tree(struct augeas *aug, int level,
static void print(struct augeas *aug, const char *path, const char *match) {
static const char *const match_var = "match";
- cleanup(freep) struct node *nodes = NULL;
+ struct node *nodes = NULL;
nodes = calloc(max_nodes, sizeof(struct node));
oom_when(nodes == NULL);
@@ -265,6 +266,10 @@ static void print(struct augeas *aug, const char *path, const char *match) {
aug_defvar(aug, nodes[0].var, prefix);
print_tree(aug, 0, prefix + strlen(path) + 1, nodes);
}
+ for (int i=0; i < max_nodes; i++) {
+ free(nodes[i].var);
+ }
+ free(nodes);
}
/* Look at the filename and try to guess based on the extension. The
@@ -421,6 +426,7 @@ int main(int argc, char **argv) {
}
print(aug, path, match);
+ free(path);
}
/*
--
2.17.2

View File

@ -1,464 +0,0 @@
From c514988fa3ff57e7622678963c1141b59b4d88d7 Mon Sep 17 00:00:00 2001
From: David Lutterkort <lutter@watzmann.net>
Date: Mon, 4 Jun 2018 23:19:28 -0700
Subject: [PATCH] Use a safer calling convention for native functions
The native functions in the lens interpreter used a calling convention that
required unsafe casting of function pointers. We now use a calling
convention that does not cause any function pointer casts.
(cherry picked from commit 31c3532e5e8d4707dfb7de12278221001dafdd5a)
---
src/builtin.c | 161 +++++++++++++++++++++++++++++++++-----------------
src/syntax.c | 34 ++---------
src/syntax.h | 11 +++-
3 files changed, 119 insertions(+), 87 deletions(-)
diff --git a/src/builtin.c b/src/builtin.c
index 732ee10c..7cf4fa0a 100644
--- a/src/builtin.c
+++ b/src/builtin.c
@@ -42,8 +42,10 @@
*/
/* V_REGEXP -> V_STRING -> V_LENS */
-static struct value *lns_del(struct info *info,
- struct value *rxp, struct value *dflt) {
+static struct value *lns_del(struct info *info, struct value **argv) {
+ struct value *rxp = argv[0];
+ struct value *dflt = argv[1];
+
assert(rxp->tag == V_REGEXP);
assert(dflt->tag == V_STRING);
return lns_make_prim(L_DEL, ref(info),
@@ -51,44 +53,59 @@ static struct value *lns_del(struct info *info,
}
/* V_REGEXP -> V_LENS */
-static struct value *lns_store(struct info *info, struct value *rxp) {
+static struct value *lns_store(struct info *info, struct value **argv) {
+ struct value *rxp = argv[0];
+
assert(rxp->tag == V_REGEXP);
return lns_make_prim(L_STORE, ref(info), ref(rxp->regexp), NULL);
}
/* V_STRING -> V_LENS */
-static struct value *lns_value(struct info *info, struct value *str) {
+static struct value *lns_value(struct info *info, struct value **argv) {
+ struct value *str = argv[0];
+
assert(str->tag == V_STRING);
return lns_make_prim(L_VALUE, ref(info), NULL, ref(str->string));
}
/* V_REGEXP -> V_LENS */
-static struct value *lns_key(struct info *info, struct value *rxp) {
+static struct value *lns_key(struct info *info, struct value **argv) {
+ struct value *rxp = argv[0];
+
assert(rxp->tag == V_REGEXP);
return lns_make_prim(L_KEY, ref(info), ref(rxp->regexp), NULL);
}
/* V_STRING -> V_LENS */
-static struct value *lns_label(struct info *info, struct value *str) {
+static struct value *lns_label(struct info *info, struct value **argv) {
+ struct value *str = argv[0];
+
assert(str->tag == V_STRING);
return lns_make_prim(L_LABEL, ref(info), NULL, ref(str->string));
}
/* V_STRING -> V_LENS */
-static struct value *lns_seq(struct info *info, struct value *str) {
+static struct value *lns_seq(struct info *info, struct value **argv) {
+ struct value *str = argv[0];
+
assert(str->tag == V_STRING);
return lns_make_prim(L_SEQ, ref(info), NULL, ref(str->string));
}
/* V_STRING -> V_LENS */
-static struct value *lns_counter(struct info *info, struct value *str) {
+static struct value *lns_counter(struct info *info, struct value **argv) {
+ struct value *str = argv[0];
+
assert(str->tag == V_STRING);
return lns_make_prim(L_COUNTER, ref(info), NULL, ref(str->string));
}
/* V_LENS -> V_LENS -> V_LENS -> V_LENS */
-static struct value *lns_square(struct info *info, struct value *l1,
- struct value *l2, struct value *l3) {
+static struct value *lns_square(struct info *info, struct value **argv) {
+ struct value *l1 = argv[0];
+ struct value *l2 = argv[1];
+ struct value *l3 = argv[2];
+
assert(l1->tag == V_LENS);
assert(l2->tag == V_LENS);
assert(l3->tag == V_LENS);
@@ -179,8 +196,10 @@ static struct value *pathx_parse_glue(struct info *info, struct value *tree,
}
/* V_LENS -> V_STRING -> V_TREE */
-static struct value *lens_get(struct info *info, struct value *l,
- struct value *str) {
+static struct value *lens_get(struct info *info, struct value **argv) {
+ struct value *l = argv[0];
+ struct value *str = argv[1];
+
assert(l->tag == V_LENS);
assert(str->tag == V_STRING);
struct lns_error *err;
@@ -210,8 +229,11 @@ static struct value *lens_get(struct info *info, struct value *l,
/* V_LENS -> V_TREE -> V_STRING -> V_STRING */
-static struct value *lens_put(struct info *info, struct value *l,
- struct value *tree, struct value *str) {
+static struct value *lens_put(struct info *info, struct value **argv) {
+ struct value *l = argv[0];
+ struct value *tree = argv[1];
+ struct value *str = argv[2];
+
assert(l->tag == V_LENS);
assert(tree->tag == V_TREE);
assert(str->tag == V_STRING);
@@ -237,11 +259,14 @@ static struct value *lens_put(struct info *info, struct value *l,
}
/* V_STRING -> V_STRING -> V_TREE -> V_TREE */
-static struct value *tree_set_glue(struct info *info, struct value *path,
- struct value *val, struct value *tree) {
+static struct value *tree_set_glue(struct info *info, struct value **argv) {
// FIXME: This only works if TREE is not referenced more than once;
// otherwise we'll have some pretty weird semantics, and would really
// need to copy TREE first
+ struct value *path = argv[0];
+ struct value *val = argv[1];
+ struct value *tree = argv[2];
+
assert(path->tag == V_STRING);
assert(val->tag == V_STRING);
assert(tree->tag == V_TREE);
@@ -277,11 +302,13 @@ static struct value *tree_set_glue(struct info *info, struct value *path,
}
/* V_STRING -> V_TREE -> V_TREE */
-static struct value *tree_clear_glue(struct info *info, struct value *path,
- struct value *tree) {
+static struct value *tree_clear_glue(struct info *info, struct value **argv) {
// FIXME: This only works if TREE is not referenced more than once;
// otherwise we'll have some pretty weird semantics, and would really
// need to copy TREE first
+ struct value *path = argv[0];
+ struct value *tree = argv[1];
+
assert(path->tag == V_STRING);
assert(tree->tag == V_TREE);
@@ -349,25 +376,32 @@ static struct value *tree_insert_glue(struct info *info, struct value *label,
/* Insert after */
/* V_STRING -> V_STRING -> V_TREE -> V_TREE */
-static struct value *tree_insa_glue(struct info *info, struct value *label,
- struct value *path, struct value *tree) {
+static struct value *tree_insa_glue(struct info *info, struct value **argv) {
+ struct value *label = argv[0];
+ struct value *path = argv[1];
+ struct value *tree = argv[2];
+
return tree_insert_glue(info, label, path, tree, 0);
}
/* Insert before */
/* V_STRING -> V_STRING -> V_TREE -> V_TREE */
-static struct value *tree_insb_glue(struct info *info, struct value *label,
- struct value *path, struct value *tree) {
+static struct value *tree_insb_glue(struct info *info, struct value **argv) {
+ struct value *label = argv[0];
+ struct value *path = argv[1];
+ struct value *tree = argv[2];
+
return tree_insert_glue(info, label, path, tree, 1);
}
/* V_STRING -> V_TREE -> V_TREE */
-static struct value *tree_rm_glue(struct info *info,
- struct value *path,
- struct value *tree) {
+static struct value *tree_rm_glue(struct info *info, struct value **argv) {
// FIXME: This only works if TREE is not referenced more than once;
// otherwise we'll have some pretty weird semantics, and would really
// need to copy TREE first
+ struct value *path = argv[0];
+ struct value *tree = argv[1];
+
assert(path->tag == V_STRING);
assert(tree->tag == V_TREE);
@@ -390,7 +424,9 @@ static struct value *tree_rm_glue(struct info *info,
}
/* V_STRING -> V_STRING */
-static struct value *gensym(struct info *info, struct value *prefix) {
+static struct value *gensym(struct info *info, struct value **argv) {
+ struct value *prefix = argv[0];
+
assert(prefix->tag == V_STRING);
static unsigned int count = 0;
struct value *v;
@@ -406,7 +442,9 @@ static struct value *gensym(struct info *info, struct value *prefix) {
}
/* V_STRING -> V_FILTER */
-static struct value *xform_incl(struct info *info, struct value *s) {
+static struct value *xform_incl(struct info *info, struct value **argv) {
+ struct value *s = argv[0];
+
assert(s->tag == V_STRING);
struct value *v = make_value(V_FILTER, ref(info));
v->filter = make_filter(ref(s->string), 1);
@@ -414,7 +452,9 @@ static struct value *xform_incl(struct info *info, struct value *s) {
}
/* V_STRING -> V_FILTER */
-static struct value *xform_excl(struct info *info, struct value *s) {
+static struct value *xform_excl(struct info *info, struct value **argv) {
+ struct value *s = argv[0];
+
assert(s->tag == V_STRING);
struct value *v = make_value(V_FILTER, ref(info));
v->filter = make_filter(ref(s->string), 0);
@@ -422,8 +462,10 @@ static struct value *xform_excl(struct info *info, struct value *s) {
}
/* V_LENS -> V_FILTER -> V_TRANSFORM */
-static struct value *xform_transform(struct info *info, struct value *l,
- struct value *f) {
+static struct value *xform_transform(struct info *info, struct value **argv) {
+ struct value *l = argv[0];
+ struct value *f = argv[1];
+
assert(l->tag == V_LENS);
assert(f->tag == V_FILTER);
if (l->lens->value || l->lens->key) {
@@ -436,14 +478,16 @@ static struct value *xform_transform(struct info *info, struct value *l,
return v;
}
-static struct value *sys_getenv(struct info *info, struct value *n) {
- assert(n->tag == V_STRING);
+static struct value *sys_getenv(struct info *info, struct value **argv) {
+ assert(argv[0]->tag == V_STRING);
struct value *v = make_value(V_STRING, ref(info));
- v->string = dup_string(getenv(n->string->str));
+ v->string = dup_string(getenv(argv[0]->string->str));
return v;
}
-static struct value *sys_read_file(struct info *info, struct value *n) {
+static struct value *sys_read_file(struct info *info, struct value **argv) {
+ struct value *n = argv[0];
+
assert(n->tag == V_STRING);
char *str = NULL;
@@ -464,7 +508,10 @@ static struct value *sys_read_file(struct info *info, struct value *n) {
/* V_LENS -> V_LENS */
static struct value *lns_check_rec_glue(struct info *info,
- struct value *l, struct value *r) {
+ struct value **argv) {
+ struct value *l = argv[0];
+ struct value *r = argv[1];
+
assert(l->tag == V_LENS);
assert(r->tag == V_LENS);
int check = typecheck_p(info);
@@ -477,28 +524,28 @@ static struct value *lns_check_rec_glue(struct info *info,
*/
/* V_STRING -> V_UNIT */
-static struct value *pr_string(struct info *info, struct value *s) {
- printf("%s", s->string->str);
+static struct value *pr_string(struct info *info, struct value **argv) {
+ printf("%s", argv[0]->string->str);
return make_unit(ref(info));
}
/* V_REGEXP -> V_UNIT */
-static struct value *pr_regexp(struct info *info, struct value *r) {
- print_regexp(stdout, r->regexp);
+static struct value *pr_regexp(struct info *info, struct value **argv) {
+ print_regexp(stdout, argv[0]->regexp);
return make_unit(ref(info));
}
/* V_STRING -> V_UNIT */
-static struct value *pr_endline(struct info *info, struct value *s) {
- printf("%s\n", s->string->str);
+static struct value *pr_endline(struct info *info, struct value **argv) {
+ printf("%s\n", argv[0]->string->str);
return make_unit(ref(info));
}
/* V_TREE -> V_TREE */
static struct value *pr_tree(ATTRIBUTE_UNUSED struct info *info,
- struct value *t) {
- print_tree_braces(stdout, 0, t->origin);
- return ref(t);
+ struct value **argv) {
+ print_tree_braces(stdout, 0, argv[0]->origin);
+ return ref(argv[0]);
}
/*
@@ -515,27 +562,29 @@ static struct value *lns_value_of_type(struct info *info, struct regexp *rx) {
}
/* V_LENS -> V_REGEXP */
-static struct value *lns_ctype(struct info *info, struct value *l) {
- return lns_value_of_type(info, l->lens->ctype);
+static struct value *lns_ctype(struct info *info, struct value **argv) {
+ return lns_value_of_type(info, argv[0]->lens->ctype);
}
/* V_LENS -> V_REGEXP */
-static struct value *lns_atype(struct info *info, struct value *l) {
- return lns_value_of_type(info, l->lens->atype);
+static struct value *lns_atype(struct info *info, struct value **argv) {
+ return lns_value_of_type(info, argv[0]->lens->atype);
}
/* V_LENS -> V_REGEXP */
-static struct value *lns_vtype(struct info *info, struct value *l) {
- return lns_value_of_type(info, l->lens->vtype);
+static struct value *lns_vtype(struct info *info, struct value **argv) {
+ return lns_value_of_type(info, argv[0]->lens->vtype);
}
/* V_LENS -> V_REGEXP */
-static struct value *lns_ktype(struct info *info, struct value *l) {
- return lns_value_of_type(info, l->lens->ktype);
+static struct value *lns_ktype(struct info *info, struct value **argv) {
+ return lns_value_of_type(info, argv[0]->lens->ktype);
}
/* V_LENS -> V_STRING */
-static struct value *lns_fmt_atype(struct info *info, struct value *l) {
+static struct value *lns_fmt_atype(struct info *info, struct value **argv) {
+ struct value *l = argv[0];
+
struct value *result = NULL;
char *s = NULL;
int r;
@@ -549,8 +598,10 @@ static struct value *lns_fmt_atype(struct info *info, struct value *l) {
}
/* V_REGEXP -> V_STRING -> V_STRING */
-static struct value *rx_match(struct info *info,
- struct value *rx, struct value *s) {
+static struct value *rx_match(struct info *info, struct value **argv) {
+ struct value *rx = argv[0];
+ struct value *s = argv[1];
+
struct value *result = NULL;
const char *str = s->string->str;
struct re_registers regs;
diff --git a/src/syntax.c b/src/syntax.c
index 612544c7..d26babcc 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -1023,42 +1023,16 @@ typedef struct value *(*impl5)(struct info *, struct value *, struct value *,
static struct value *native_call(struct info *info,
struct native *func, struct ctx *ctx) {
- struct value *argv[func->argc];
+ struct value *argv[func->argc + 1];
struct binding *b = ctx->local;
- struct value *result;
for (int i = func->argc - 1; i >= 0; i--) {
argv[i] = b->value;
b = b->next;
}
+ argv[func->argc] = NULL;
- switch(func->argc) {
- case 0:
- result = ((impl0) *func->impl)(info);
- break;
- case 1:
- result = ((impl1) *func->impl)(info, argv[0]);
- break;
- case 2:
- result = ((impl2) *func->impl)(info, argv[0], argv[1]);
- break;
- case 3:
- result = ((impl3) *func->impl)(info, argv[0], argv[1], argv[2]);
- break;
- case 4:
- result = ((impl4) *func->impl)(info, argv[0], argv[1], argv[2], argv[3]);
- break;
- case 5:
- result = ((impl5) *func->impl)(info, argv[0], argv[1], argv[2], argv[3],
- argv[4]);
- break;
- default:
- assert(0);
- abort();
- break;
- }
-
- return result;
+ return func->impl(info, argv);
}
static void type_error1(struct info *info, const char *msg, struct type *type) {
@@ -1857,7 +1831,7 @@ make_native_info(struct error *error, const char *fname, int line) {
int define_native_intl(const char *file, int line,
struct error *error,
struct module *module, const char *name,
- int argc, void *impl, ...) {
+ int argc, func_impl impl, ...) {
assert(argc > 0); /* We have no unit type */
assert(argc <= 5);
va_list ap;
diff --git a/src/syntax.h b/src/syntax.h
index 12c3bae4..30aefe58 100644
--- a/src/syntax.h
+++ b/src/syntax.h
@@ -112,10 +112,17 @@ struct param {
struct type *type;
};
+/* The protoype for the implementation of a native/builtin function in the
+ * interpreter.
+ *
+ * The arguments are passed as a NULL-terminated array of values.
+ */
+typedef struct value *(*func_impl)(struct info *, struct value *argv[]);
+
struct native {
unsigned int argc;
struct type *type;
- struct value *(*impl)(void);
+ func_impl impl;
};
/* An exception in the interpreter. Some exceptions are reported directly
@@ -270,7 +277,7 @@ ATTRIBUTE_RETURN_CHECK
int define_native_intl(const char *fname, int line,
struct error *error,
struct module *module, const char *name,
- int argc, void *impl, ...);
+ int argc, func_impl impl, ...);
struct module *builtin_init(struct error *);
--
2.17.2

View File

@ -1,27 +0,0 @@
From 47ec34301b9a797e9a6cb8b24adf9fc7fb3bbbd3 Mon Sep 17 00:00:00 2001
From: David Lutterkort <lutter@watzmann.net>
Date: Mon, 29 Jan 2018 14:03:36 +0100
Subject: [PATCH] * src/augeas.c (aug_source): actually return the source for
the node
(cherry picked from commit 70481d8e09af372f168a38755ae3173df1fe43d9)
---
src/augeas.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/augeas.c b/src/augeas.c
index 8ec264cf..df760f50 100644
--- a/src/augeas.c
+++ b/src/augeas.c
@@ -1958,7 +1958,7 @@ int aug_source(const augeas *aug, const char *path, char **file_path) {
ERR_THROW(r == 0, aug, AUG_ENOMATCH, "There is no node matching %s",
path);
- tree_source(aug, match);
+ *file_path = tree_source(aug, match);
ERR_BAIL(aug);
result = 0;
--
2.17.2

View File

@ -1,81 +0,0 @@
From 8686eeeea05de0c5a3aeccfa7560b7668635b99e Mon Sep 17 00:00:00 2001
From: David Lutterkort <lutter@watzmann.net>
Date: Mon, 11 Jun 2018 12:20:31 -0700
Subject: [PATCH] * tests/test-api.c: add a check for aug_source
(cherry picked from commit 74e2f6c74e2e910034339dcda2d46c9aa3f83776)
---
src/augeas.h | 2 ++
tests/test-api.c | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 38 insertions(+)
diff --git a/src/augeas.h b/src/augeas.h
index d6a1a707..a8770790 100644
--- a/src/augeas.h
+++ b/src/augeas.h
@@ -403,6 +403,8 @@ int aug_print(const augeas *aug, FILE *out, const char *path);
* contain the path to the toplevel node of that file underneath /files. If
* it does not, *FILE_PATH will be NULL.
*
+ * The caller is responsible for freeing *FILE_PATH
+ *
* Returns:
* 0 on success, or a negative value on failure. It is an error if PATH
* matches more than one node.
diff --git a/tests/test-api.c b/tests/test-api.c
index fda8ab6a..6460d7ba 100644
--- a/tests/test-api.c
+++ b/tests/test-api.c
@@ -816,6 +816,41 @@ static void testAugNs(CuTest *tc) {
aug_close(aug);
}
+/* Test aug_source */
+static void testAugSource(CuTest *tc) {
+ struct augeas *aug;
+ int r;
+ char *s;
+
+ aug = aug_init(root, loadpath, AUG_NO_STDINC|AUG_NO_LOAD);
+ CuAssertPtrNotNull(tc, aug);
+ CuAssertIntEquals(tc, AUG_NOERROR, aug_error(aug));
+
+ r = aug_load_file(aug, "/etc/hosts");
+ CuAssertIntEquals(tc, 0, r);
+
+ r = aug_source(aug, "/files/etc/hosts/1", &s);
+ CuAssertIntEquals(tc, 0, r);
+ CuAssertStrEquals(tc, "/files/etc/hosts", s);
+ free(s);
+
+ r = aug_source(aug, "/files/etc/fstab", &s);
+ CuAssertIntEquals(tc, -1, r);
+ CuAssertIntEquals(tc, AUG_ENOMATCH, aug_error(aug));
+ CuAssertPtrEquals(tc, NULL, s);
+
+ r = aug_source(aug, "/files[", &s);
+ CuAssertIntEquals(tc, -1, r);
+ CuAssertIntEquals(tc, AUG_EPATHX, aug_error(aug));
+ CuAssertPtrEquals(tc, NULL, s);
+
+ r = aug_source(aug, "/files/etc/hosts/*", &s);
+ CuAssertIntEquals(tc, -1, r);
+ CuAssertIntEquals(tc, AUG_EMMATCH, aug_error(aug));
+ CuAssertPtrEquals(tc, NULL, s);
+
+}
+
int main(void) {
char *output = NULL;
CuSuite* suite = CuSuiteNew();
@@ -840,6 +875,7 @@ int main(void) {
SUITE_ADD_TEST(suite, testLoadBadPath);
SUITE_ADD_TEST(suite, testLoadBadLens);
SUITE_ADD_TEST(suite, testAugNs);
+ SUITE_ADD_TEST(suite, testAugSource);
abs_top_srcdir = getenv("abs_top_srcdir");
if (abs_top_srcdir == NULL)
--
2.17.2

View File

@ -1,47 +0,0 @@
From 78c87b3f3b359fac5401f81a86dd9e2f5968220e Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Thu, 19 Jul 2018 15:43:21 +0200
Subject: [PATCH] * src/augtool.c: fix access to invalid memory
When stripping the context from the result, readline_path_generator used
to realloc the string to a shorter size, copying only the content after
the prefix. This resulted in reading with strcpy from the previous
memory, which is freed already. Avoid the issue, and simplify the code
by using strdup, freeing the old string.
This issue could be reproduced in augtool, trying to autocomplete files
without the /files prefix, e.g.:
augtool> ls <TAB><TAB>
(cherry picked from commit 05b5784b2029f198ea486738d33fb7b49ef23eb8)
---
src/augtool.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/src/augtool.c b/src/augtool.c
index ff097bd9..2745812c 100644
--- a/src/augtool.c
+++ b/src/augtool.c
@@ -153,15 +153,13 @@ static char *readline_path_generator(const char *text, int state) {
/* strip off context if the user didn't give it */
if (ctx != NULL) {
- char *c = realloc(child, strlen(child)-strlen(ctx)+1);
- if (c == NULL) {
- free(child);
- return NULL;
- }
int ctxidx = strlen(ctx);
if (child[ctxidx] == SEP)
ctxidx++;
- strcpy(c, &child[ctxidx]);
+ char *c = strdup(&child[ctxidx]);
+ free(child);
+ if (c == NULL)
+ return NULL;
child = c;
}
--
2.17.2

View File

@ -1,32 +0,0 @@
From dfbd54466e83b8c545da931db73f6c0ac73ae136 Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Thu, 19 Jul 2018 16:55:58 +0200
Subject: [PATCH] * src/fa.c (fa_dot_debug): check result of fopen
Return earlier if fopen fails, otherwise fa_dot will dereference a null
pointer.
(cherry picked from commit 2fd3692404cd4290f106bc6886e6cba949452fa0)
---
src/fa.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/fa.c b/src/fa.c
index 412d1394..8e1d7d47 100644
--- a/src/fa.c
+++ b/src/fa.c
@@ -286,6 +286,11 @@ static void fa_dot_debug(struct fa *fa, const char *tag) {
return;
fp = fopen(fname, "w");
+ if (fp == NULL) {
+ free(fname);
+ return;
+ }
+
fa_dot(fp, fa);
fclose(fp);
free(fname);
--
2.17.2

View File

@ -1,44 +0,0 @@
From d2822e9faffdffc44ab6d8418c13b63a65e20338 Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Fri, 20 Jul 2018 14:08:50 +0200
Subject: [PATCH] * src/jmt.c (add_lens): fix memory leak w/ debugging
format_lens returns a new string every time, so save its result, and
free it properly after use.
(cherry picked from commit 4310fcc41c6f870da71d07423d6ac64ea6a60998)
---
src/jmt.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/src/jmt.c b/src/jmt.c
index 79953da1..86179eed 100644
--- a/src/jmt.c
+++ b/src/jmt.c
@@ -1109,16 +1109,20 @@ static ind_t add_lens(struct jmt *jmt, struct lens *lens) {
if (debugging("cf.jmt")) {
if (sA == NULL) {
+ char *s = format_lens(lens);
printf("add_lens: ");
print_regexp(stdout, lens->ctype);
- printf(" %s\n", format_lens(lens));
+ printf(" %s\n", s);
+ free(s);
} else {
+ char *s = format_lens(lens);
printf("add_lens: ");
flens(stdout, l);
- printf(" %u %s\n", sA->num, format_lens(lens));
+ printf(" %u %s\n", sA->num, s);
if (nullable) {
- printf("add_lens: // %s\n", format_lens(lens));
+ printf("add_lens: // %s\n", s);
}
+ free(s);
}
}
--
2.17.2

View File

@ -1,29 +0,0 @@
From 095005bc98e28df6abcbb75dccfbbfa59d7b440d Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Fri, 20 Jul 2018 16:25:33 +0200
Subject: [PATCH] * src/pathx.c (parse_location_path): fix memleak on error
If parse_relative_location_path fails, then the early return will leak
locpath. Use the common error handling to cleanup all the resources.
(cherry picked from commit b8dc554919827d70a6d24b054da463254164dca2)
---
src/pathx.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/pathx.c b/src/pathx.c
index 48c8b0b1..bd0fe2e3 100644
--- a/src/pathx.c
+++ b/src/pathx.c
@@ -1971,7 +1971,7 @@ static void parse_location_path(struct state *state) {
state->pos += 1;
locpath = parse_relative_location_path(state);
if (HAS_ERROR(state))
- return;
+ goto error;
struct step *step = make_step(DESCENDANT_OR_SELF, state);
if (HAS_ERROR(state))
goto error;
--
2.17.2

View File

@ -1,43 +0,0 @@
From 7d296f655e21e0e6866e783c534fee4629bc7a38 Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Fri, 20 Jul 2018 16:30:26 +0200
Subject: [PATCH] * src/syntax.c (interpreter_init): fix memleak on load_module
fail
If load_module fails, then name is not freed. Instead, store the
return value of load_module separately, cleanup name, and then check
that value.
(cherry picked from commit d5a6da8a8e302b8bf1fe35ae0bdd0433e522ddf2)
---
src/syntax.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/syntax.c b/src/syntax.c
index d26babcc..f9f2849e 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -2060,6 +2060,7 @@ int interpreter_init(struct augeas *aug) {
for (int i=0; i < globbuf.gl_pathc; i++) {
char *name, *p, *q;
+ int res;
p = strrchr(globbuf.gl_pathv[i], SEP);
if (p == NULL)
p = globbuf.gl_pathv[i];
@@ -2068,9 +2069,10 @@ int interpreter_init(struct augeas *aug) {
q = strchr(p, '.');
name = strndup(p, q - p);
name[0] = toupper(name[0]);
- if (load_module(aug, name) == -1)
- goto error;
+ res = load_module(aug, name);
free(name);
+ if (res == -1)
+ goto error;
}
globfree(&globbuf);
return 0;
--
2.17.2

View File

@ -1,29 +0,0 @@
From 93c4dc92dfbc5fbca8fbda96dc68172430b7095e Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Fri, 20 Jul 2018 16:32:44 +0200
Subject: [PATCH] * src/transform.c (transform_save): fix leaks on fchmod fail
If fchmod fails, the early return prevents any cleanup of the function
resources, e.g. the open FILEs. Use the common error handling instead.
(cherry picked from commit 4d1a3f3cd8d97f852c6e7c50942255d535ad1405)
---
src/transform.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/transform.c b/src/transform.c
index 6a0ce858..176482b9 100644
--- a/src/transform.c
+++ b/src/transform.c
@@ -1258,7 +1258,7 @@ int transform_save(struct augeas *aug, struct tree *xfm,
if (fchmod(fileno(fp), 0666 & ~curumsk) < 0) {
err_status = "create_chmod";
- return -1;
+ goto done;
}
}
--
2.17.2

View File

@ -1,28 +0,0 @@
From 7ae515ec6182fe2e4e834444eadefac0d4ac5fbd Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Fri, 20 Jul 2018 16:34:40 +0200
Subject: [PATCH] * src/augparse.c (main): call aug_close even on failure
Even if the resources will be freed at the exit, manually call aug_close
to make sure that analyzers/checkers see only the real issues.
(cherry picked from commit c1f99b22810526f674f38c4faee647bcf061e4e3)
---
src/augparse.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/augparse.c b/src/augparse.c
index 96a686c8..ad2342ac 100644
--- a/src/augparse.c
+++ b/src/augparse.c
@@ -140,6 +140,7 @@ int main(int argc, char **argv) {
if (s != NULL) {
fprintf(stderr, "%s\n", s);
}
+ aug_close(aug);
exit(EXIT_FAILURE);
}
--
2.17.2

View File

@ -1,159 +0,0 @@
From ae4e64c5bba611f6c1e2714aa834f365996f42f6 Mon Sep 17 00:00:00 2001
From: David Lutterkort <lutter@watzmann.net>
Date: Mon, 4 Jun 2018 10:45:19 -0700
Subject: [PATCH] Grub: tolerate some invalid entries
Refusing to parse an entire file because of invalid entries is too
harsh. Try to make the behavior a little friendlier by simply mapping invalid
entries to '#error' nodes but still parsing the rest of the file.
Also remove del_to_eol, that would delete anything up to eol; it was only
used in kw_pres, but should have never been used there. kw_pres should only
match the keyword and eol. A line like 'quiet foo bar baz' should not be
accepted by (kw_pres "quiet").
---
lenses/grub.aug | 58 ++++++++++++++++++++++++++++++++------
lenses/tests/test_grub.aug | 25 ++++++++++++++++
2 files changed, 75 insertions(+), 8 deletions(-)
diff --git a/lenses/grub.aug b/lenses/grub.aug
index 06f9e79f..24ad39bc 100644
--- a/lenses/grub.aug
+++ b/lenses/grub.aug
@@ -29,9 +29,6 @@ module Grub =
(* View: eol *)
let eol = Util.eol
- (* View: del_to_eol *)
- let del_to_eol = del /[^ \t\n]*/ ""
-
(* View: spc *)
let spc = Util.del_ws_spc
@@ -92,7 +89,22 @@ module Grub =
eol ]
(* View: kw_pres *)
- let kw_pres (kw:string) = [ opt_ws . key kw . del_to_eol . eol ]
+ let kw_pres (kw:string) = [ opt_ws . key kw . eol ]
+
+ (* View: error
+ * Parse a line that looks almost like a valid setting, but isn't,
+ * into an '#error' node. Any line that starts with letters, but not
+ * anything matching kw, is considered an error line.
+ *
+ * Parameters:
+ * kw:regexp - the valid keywords that are _not_ considered an
+ * error
+ *)
+ let error (kw:regexp) =
+ let not_kw = /[a-zA-Z]+/ - kw in
+ [ label "#error" . Util.del_opt_ws "\t"
+ . store (not_kw . /([^a-zA-Z\n].*[^ \t\n])?/) . eol ]
+
(************************************************************************
* Group: BOOT ENTRIES
@@ -138,8 +150,8 @@ module Grub =
spc . [ label "from" . store Rx.no_spaces ] )? .
eol ]
- (* View: menu_setting *)
- let menu_setting = kw_menu_arg "default"
+ (* View: menu_entry *)
+ let menu_entry = kw_menu_arg "default"
| kw_menu_arg "fallback"
| kw_pres "hiddenmenu"
| kw_menu_arg "timeout"
@@ -156,6 +168,21 @@ module Grub =
| device
| setkey
+ (* View: menu_error
+ * Accept lines not matching menu_entry and stuff them into
+ * '#error' nodes
+ *)
+ let menu_error =
+ let kw = /default|fallback|hiddenmenu|timeout|splashimage|gfxmenu/
+ |/foreground|background|verbose|boot|password|title/
+ |/serial|setkey|terminal|color|device/ in
+ error kw
+
+ (* View: menu_setting
+ * a valid menu setting or a line that looks like one but is an #error
+ *)
+ let menu_setting = menu_entry | menu_error
+
(* View: title *)
let title = del /title[ \t=]+/ "title " . value_to_eol . eol
@@ -206,9 +233,9 @@ module Grub =
let configfile =
[ command "configfile" "\t" . spc . store Rx.no_spaces . eol ]
- (* View: boot_setting
+ (* View: boot_entry
<boot> entries *)
- let boot_setting =
+ let boot_entry =
let boot_arg_re = "root" | "initrd" | "rootnoverify" | "uuid"
| "findroot" | "bootfs" (* Solaris extensions *)
in kw_boot_arg boot_arg_re
@@ -223,6 +250,21 @@ module Grub =
| kw_pres "makeactive"
| password_arg
+ (* View: boot_error
+ * Accept lines not matching boot_entry and stuff them into
+ * '#error' nodes
+ *)
+ let boot_error =
+ let kw = /lock|uuid|password|root|initrd|rootnoverify|findroot|bootfs/
+ |/configfile|chainloader|title|boot|quiet|kernel|module/
+ |/makeactive|savedefault|map/ in
+ error kw
+
+ (* View: boot_setting
+ * a valid boot setting or a line that looks like one but is an #error
+ *)
+ let boot_setting = boot_entry | boot_error
+
(* View: boot *)
let boot =
let line = ((boot_setting|comment)* . boot_setting)? in
diff --git a/lenses/tests/test_grub.aug b/lenses/tests/test_grub.aug
index 8a0d9f4a..75657203 100644
--- a/lenses/tests/test_grub.aug
+++ b/lenses/tests/test_grub.aug
@@ -257,3 +257,28 @@ password --encrypted ^9^32kwzzX./3WISQ0C /boot/grub/custom.lst
{ "password" = "secret"
{ "md5" }
} }
+
+ (* Test parsing of invalid entries via menu_error *)
+ test Grub.lns get "default=0\ncrud=no\n" =
+ { "default" = "0" }
+ { "#error" = "crud=no" }
+
+ (* We handle some pretty bizarre bad syntax *)
+ test Grub.lns get "default=0
+crud no
+valid:nope
+nonsense = yes
+bad arg1 arg2 arg3=v\n" =
+ { "default" = "0" }
+ { "#error" = "crud no" }
+ { "#error" = "valid:nope" }
+ { "#error" = "nonsense = yes" }
+ { "#error" = "bad arg1 arg2 arg3=v" }
+
+ (* Test parsing of invalid entries via boot_error *)
+ test Grub.lns get "title test
+ root (hd0,0)
+ crud foo\n" =
+ { "title" = "test"
+ { "root" = "(hd0,0)" }
+ { "#error" = "crud foo" } }
--
2.17.2

View File

@ -1,26 +0,0 @@
From 27b453cf1413be596175e676bc88a493959f5c4e Mon Sep 17 00:00:00 2001
From: Steve Traylen <steve.traylen@cern.ch>
Date: Thu, 1 Nov 2018 13:54:32 +0100
Subject: [PATCH] Fix sudoers lens: "always_query_group_plugin" (#588)
The option is now enabled by default in the default sudoers of
RHEL 7.6 (and probably soon CentOS 7).
---
lenses/sudoers.aug | 1 +
1 file changed, 1 insertion(+)
diff --git a/lenses/sudoers.aug b/lenses/sudoers.aug
index 11920d77..043c5636 100644
--- a/lenses/sudoers.aug
+++ b/lenses/sudoers.aug
@@ -316,6 +316,7 @@ let parameter_flag_kw = "always_set_home" | "authenticate" | "env_editor"
| "closefrom_override" | "compress_io" | "fast_glob"
| "log_input" | "log_output" | "pwfeedback"
| "umask_override" | "use_pty" | "match_group_by_gid"
+ | "always_query_group_plugin"
let parameter_flag = [ del_negate . negate_node?
. key parameter_flag_kw ]
--
2.17.2

View File

@ -1,40 +0,0 @@
From a76a98b08de120f90a2c51fa43a86288ba6aebf8 Mon Sep 17 00:00:00 2001
From: David Lutterkort <lutter@watzmann.net>
Date: Wed, 13 Jun 2018 19:24:38 -0700
Subject: [PATCH] Rsyslog: support include() directive
---
lenses/rsyslog.aug | 2 +-
lenses/tests/test_rsyslog.aug | 6 ++++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/lenses/rsyslog.aug b/lenses/rsyslog.aug
index 6648f3de..35f19a5b 100644
--- a/lenses/rsyslog.aug
+++ b/lenses/rsyslog.aug
@@ -33,7 +33,7 @@ let config_object_param = [ key /[A-Za-z.]+/ . Sep.equal . Quote.dquote
let config_sep = del /[ \t]+|[ \t]*#.*\n[ \t]*/ " "
let config_object =
- [ key /action|global|input|module|parser|timezone/ .
+ [ key /action|global|input|module|parser|timezone|include/ .
Sep.lbracket .
config_object_param . ( config_sep . config_object_param )* .
Sep.rbracket . Util.comment_or_eol ]
diff --git a/lenses/tests/test_rsyslog.aug b/lenses/tests/test_rsyslog.aug
index b71d32c5..5386f836 100644
--- a/lenses/tests/test_rsyslog.aug
+++ b/lenses/tests/test_rsyslog.aug
@@ -199,3 +199,9 @@ test Rsyslog.lns get "module(load=\"imuxsock\" # provides support for local s
{ "SysSock.Use" = "off" }
{ "#comment" = "Turn off message reception via local log socket;" } }
{ "#comment" = "local messages are retrieved through imjournal now." }
+
+(* Added in rsyslog 8.33 *)
+test Rsyslog.lns get "include(file=\"/etc/rsyslog.d/*.conf\" mode=\"optional\")\n" =
+ { "include"
+ { "file" = "/etc/rsyslog.d/*.conf" }
+ { "mode" = "optional" } }
--
2.17.2

View File

@ -1,173 +0,0 @@
From eafe62886f8941e249d8eceaee732d3b35e19616 Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Thu, 29 Nov 2018 11:22:28 +0100
Subject: [PATCH] New lens: Semanage (#594)
Introduce a new lens to parse /etc/selinux/semanage.conf instead of
using Simplevars: the latter cannot handle the more complex syntax of
groups introduced in newer versions of libsemanage.
---
lenses/semanage.aug | 37 ++++++++++++++++
lenses/simplevars.aug | 1 -
lenses/tests/test_semanage.aug | 81 ++++++++++++++++++++++++++++++++++
tests/Makefile.am | 1 +
4 files changed, 119 insertions(+), 1 deletion(-)
create mode 100644 lenses/semanage.aug
create mode 100644 lenses/tests/test_semanage.aug
diff --git a/lenses/semanage.aug b/lenses/semanage.aug
new file mode 100644
index 00000000..46f93b32
--- /dev/null
+++ b/lenses/semanage.aug
@@ -0,0 +1,37 @@
+(*
+Module: Semanage
+ Parses /etc/selinux/semanage.conf
+
+Author:
+ Pino Toscano <ptoscano@redhat.com>
+
+About: License
+ This file is licenced under the LGPL v2+, like the rest of Augeas.
+
+About: Configuration files
+ This lens applies to /etc/selinux/semanage.conf. See <filter>.
+
+About: Examples
+ The <Test_Semanage> file contains various examples and tests.
+*)
+
+module Semanage =
+ autoload xfm
+
+let comment = IniFile.comment "#" "#"
+let sep = IniFile.sep "=" "="
+let empty = IniFile.empty
+let eol = IniFile.eol
+
+let entry = IniFile.entry IniFile.entry_re sep comment
+ | empty
+
+let title = IniFile.title_label "@group" (IniFile.record_re - /^end$/)
+let record = [ title . entry+ . Util.del_str "[end]" . eol ]
+
+let lns = (entry | record)*
+
+(* Variable: filter *)
+let filter = incl "/etc/selinux/semanage.conf"
+
+let xfm = transform lns filter
diff --git a/lenses/simplevars.aug b/lenses/simplevars.aug
index ad9795f0..6e6547cc 100644
--- a/lenses/simplevars.aug
+++ b/lenses/simplevars.aug
@@ -46,6 +46,5 @@ let filter = incl "/etc/kernel-img.conf"
. incl "/etc/audit/auditd.conf"
. incl "/etc/mixerctl.conf"
. incl "/etc/wsconsctlctl.conf"
- . incl "/etc/selinux/semanage.conf"
let xfm = transform lns filter
diff --git a/lenses/tests/test_semanage.aug b/lenses/tests/test_semanage.aug
new file mode 100644
index 00000000..a6ceaca0
--- /dev/null
+++ b/lenses/tests/test_semanage.aug
@@ -0,0 +1,81 @@
+(*
+Module: Test_Semanage
+ Provides unit tests and examples for the <Semanage> lens.
+*)
+
+module Test_Semanage =
+
+(* Variable: phony_conf *)
+let phony_conf = "# this is a comment
+
+mykey = myvalue # eol comment
+anotherkey = another value
+"
+
+(* Test: Semanage.lns *)
+test Semanage.lns get phony_conf =
+ { "#comment" = "this is a comment" }
+ { }
+ { "mykey" = "myvalue"
+ { "#comment" = "eol comment" } }
+ { "anotherkey" = "another value" }
+
+(* Test: Semanage.lns
+ Quotes are OK in variables that do not begin with a quote *)
+test Semanage.lns get "UserParameter=custom.vfs.dev.read.ops[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$4}'\n" =
+ { "UserParameter" = "custom.vfs.dev.read.ops[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$4}'" }
+
+(* Test: Semanage.lns
+ Support empty values *)
+test Semanage.lns get "foo =\n" =
+ { "foo" }
+
+(* Variable: conf *)
+let conf = "module-store = direct
+module-store = \"source\"
+
+#policy-version = 19
+
+expand-check=0
+
+usepasswd=False
+bzip-small=true
+bzip-blocksize=5
+ignoredirs=/root
+
+[sefcontext_compile]
+path = /usr/sbin/sefcontext_compile
+args = -r $@
+
+[end]
+
+config=test
+
+[verify module]
+test=value
+[end]
+"
+
+(* Test: Semanage.lns *)
+test Semanage.lns get conf =
+ { "module-store" = "direct" }
+ { "module-store" = "source" }
+ { }
+ { "#comment" = "policy-version = 19" }
+ { }
+ { "expand-check" = "0" }
+ { }
+ { "usepasswd" = "False" }
+ { "bzip-small" = "true" }
+ { "bzip-blocksize" = "5" }
+ { "ignoredirs" = "/root" }
+ { }
+ { "@group" = "sefcontext_compile"
+ { "path" = "/usr/sbin/sefcontext_compile" }
+ { "args" = "-r $@" }
+ { } }
+ { }
+ { "config" = "test" }
+ { }
+ { "@group" = "verify module"
+ { "test" = "value" } }
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 8e035e91..2b87c1c7 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -186,6 +186,7 @@ lens_tests = \
lens-rx.sh \
lens-samba.sh \
lens-securetty.sh \
+ lens-semanage.sh \
lens-services.sh \
lens-shadow.sh \
lens-shells.sh \
--
2.17.2

View File

@ -1,186 +0,0 @@
From affbc1187de0ca5f9c0cc23ba75da7b8d09402e4 Mon Sep 17 00:00:00 2001
From: Pino Toscano <ptoscano@redhat.com>
Date: Wed, 12 Dec 2018 13:54:06 +0100
Subject: [PATCH] New lens: Anaconda (#597)
Introduce a new lens to parse the INI-like `/etc/sysconfig/anaconda` instead of using `Shellvars`.
---
lenses/anaconda.aug | 30 +++++++++++
lenses/shellvars.aug | 1 +
lenses/tests/test_anaconda.aug | 89 +++++++++++++++++++++++++++++++
tests/Makefile.am | 1 +
tests/root/etc/sysconfig/anaconda | 5 ++
5 files changed, 126 insertions(+)
create mode 100644 lenses/anaconda.aug
create mode 100644 lenses/tests/test_anaconda.aug
create mode 100644 tests/root/etc/sysconfig/anaconda
diff --git a/lenses/anaconda.aug b/lenses/anaconda.aug
new file mode 100644
index 00000000..8f618db2
--- /dev/null
+++ b/lenses/anaconda.aug
@@ -0,0 +1,30 @@
+(*
+Module: Anaconda
+ Parses Anaconda's user interaction configuration files.
+
+Author: Pino Toscano <ptoscano@redhat.com>
+
+About: Reference
+ https://anaconda-installer.readthedocs.io/en/latest/user-interaction-config-file-spec.html
+
+About: Configuration file
+ This lens applies to /etc/sysconfig/anaconda.
+
+About: License
+ This file is licensed under the LGPL v2+, like the rest of Augeas.
+*)
+module Anaconda =
+autoload xfm
+
+let comment = IniFile.comment "#" "#"
+let sep = IniFile.sep "=" "="
+
+let entry = IniFile.entry IniFile.entry_re sep comment
+let title = IniFile.title IniFile.record_re
+let record = IniFile.record title entry
+
+let lns = IniFile.lns record comment
+
+let filter = incl "/etc/sysconfig/anaconda"
+
+let xfm = transform lns filter
diff --git a/lenses/shellvars.aug b/lenses/shellvars.aug
index c92d56ea..467e9643 100644
--- a/lenses/shellvars.aug
+++ b/lenses/shellvars.aug
@@ -252,6 +252,7 @@ module Shellvars =
let filter_sysconfig =
sc_incl "*" .
+ sc_excl "anaconda" .
sc_excl "bootloader" .
sc_excl "hw-uuid" .
sc_excl "hwconf" .
diff --git a/lenses/tests/test_anaconda.aug b/lenses/tests/test_anaconda.aug
new file mode 100644
index 00000000..50b0ac22
--- /dev/null
+++ b/lenses/tests/test_anaconda.aug
@@ -0,0 +1,89 @@
+(*
+Module: Test_Anaconda
+ Provides unit tests and examples for the <Anaconda> lens.
+
+ - 'exampleN' snippets are taken from the documentation:
+ https://anaconda-installer.readthedocs.io/en/latest/user-interaction-config-file-spec.html
+ - 'installedN' snippets are taken from the resulting files after
+ a successful installation
+*)
+
+module Test_Anaconda =
+
+let example1 = "# comment example - before the section headers
+
+[section_1]
+# comment example - inside section 1
+key_a_in_section1=some_value
+key_b_in_section1=some_value
+
+[section_2]
+# comment example - inside section 2
+key_a_in_section2=some_value
+"
+
+test Anaconda.lns get example1 =
+ { "#comment" = "comment example - before the section headers" }
+ { }
+ { "section_1"
+ { "#comment" = "comment example - inside section 1" }
+ { "key_a_in_section1" = "some_value" }
+ { "key_b_in_section1" = "some_value" }
+ { }
+ }
+ { "section_2"
+ { "#comment" = "comment example - inside section 2" }
+ { "key_a_in_section2" = "some_value" }
+ }
+
+let example2 = "# this is the user interaction config file
+
+[General]
+post_install_tools_disabled=0
+
+[DatetimeSpoke]
+# the date and time spoke has been visited
+visited=1
+changed_timezone=1
+changed_ntp=0
+changed_timedate=1
+
+[KeyboardSpoke]
+# the keyboard spoke has not been visited
+visited=0
+"
+
+test Anaconda.lns get example2 =
+ { "#comment" = "this is the user interaction config file" }
+ { }
+ { "General"
+ { "post_install_tools_disabled" = "0" }
+ { }
+ }
+ { "DatetimeSpoke"
+ { "#comment" = "the date and time spoke has been visited" }
+ { "visited" = "1" }
+ { "changed_timezone" = "1" }
+ { "changed_ntp" = "0" }
+ { "changed_timedate" = "1" }
+ { }
+ }
+ { "KeyboardSpoke"
+ { "#comment" = "the keyboard spoke has not been visited" }
+ { "visited" = "0" }
+ }
+
+let installed1 = "# This file has been generated by the Anaconda Installer 21.48.22.134-1
+
+[ProgressSpoke]
+visited = 1
+
+"
+
+test Anaconda.lns get installed1 =
+ { "#comment" = "This file has been generated by the Anaconda Installer 21.48.22.134-1" }
+ { }
+ { "ProgressSpoke"
+ { "visited" = "1" }
+ { }
+ }
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2b87c1c7..7aa1f14c 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -22,6 +22,7 @@ lens_tests = \
lens-activemq_xml.sh \
lens-afs_cellalias.sh \
lens-aliases.sh \
+ lens-anaconda.sh \
lens-anacron.sh \
lens-approx.sh \
lens-apt_update_manager.sh \
diff --git a/tests/root/etc/sysconfig/anaconda b/tests/root/etc/sysconfig/anaconda
new file mode 100644
index 00000000..73318cf6
--- /dev/null
+++ b/tests/root/etc/sysconfig/anaconda
@@ -0,0 +1,5 @@
+# This file has been generated by the Anaconda Installer 21.48.22.134-1
+
+[ProgressSpoke]
+visited = 1
+
--
2.17.2

View File

@ -1,28 +1,12 @@
Name: augeas
Version: 1.10.1
Release: 8%{?dist}
Version: 1.12.0
Release: 2%{?dist}
Summary: A library for changing configuration files
Group: System Environment/Libraries
License: LGPLv2+
URL: http://augeas.net/
Source0: http://download.augeas.net/%{name}-%{version}.tar.gz
Patch1: 0001-Fix-several-memory-leak-in-augmatch.patch
Patch2: 0002-Use-a-safer-calling-convention-for-native-functions.patch
Patch3: 0003-src-augeas.c-aug_source-actually-return-the-source-f.patch
Patch4: 0004-tests-test-api.c-add-a-check-for-aug_source.patch
Patch5: 0005-src-augtool.c-fix-access-to-invalid-memory.patch
Patch6: 0006-src-fa.c-fa_dot_debug-check-result-of-fopen.patch
Patch7: 0007-src-jmt.c-add_lens-fix-memory-leak-w-debugging.patch
Patch8: 0008-src-pathx.c-parse_location_path-fix-memleak-on-error.patch
Patch9: 0009-src-syntax.c-interpreter_init-fix-memleak-on-load_mo.patch
Patch10: 0010-src-transform.c-transform_save-fix-leaks-on-fchmod-f.patch
Patch11: 0011-src-augparse.c-main-call-aug_close-even-on-failure.patch
Patch12: 0012-Grub-tolerate-some-invalid-entries.patch
Patch13: 0013-Fix-sudoers-lens-always_query_group_plugin-588.patch
Patch14: 0014-Rsyslog-support-include-directive.patch
Patch15: 0015-New-lens-Semanage-594.patch
Patch16: 0016-New-lens-Anaconda-597.patch
BuildRequires: readline-devel libselinux-devel libxml2-devel
BuildRequires: autoconf, automake
@ -63,46 +47,17 @@ configuration files into a tree structure, which it exposes through its
public API. Changes made through the API are written back to the initially
read files.
%package static
Summary: Static libraries for %{name}
Group: Development/Libraries
Requires: %{name}-devel = %{version}-%{release}
%description static
The %{name}-static package contains static libraries needed to produce
static builds using %{name}.
%prep
%setup -q
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
# Patches affect Makefile.am and configure.ac, so rerun autotools.
autoreconf
autoconf
%build
%configure \
%ifarch riscv64
--disable-gnulib-tests \
%endif
--enable-static
--disable-static
make V=1 %{?_smp_mflags}
%check
@ -125,9 +80,6 @@ find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'
# so it shouldn't be packaged.
rm -r $RPM_BUILD_ROOT%{_datadir}/augeas/lenses/dist/tests
# In 1.9.0, the example /usr/bin/dump gets installed inadvertently
rm -f $RPM_BUILD_ROOT/usr/bin/dump
%clean
rm -rf $RPM_BUILD_ROOT
@ -160,12 +112,14 @@ rm -rf $RPM_BUILD_ROOT
%{_libdir}/*.so
%{_libdir}/pkgconfig/augeas.pc
%files static
%defattr(-,root,root,-)
%{_libdir}/libaugeas.a
%{_libdir}/libfa.a
%changelog
* Mon Jun 03 2019 Pino Toscano <ptoscano@redhat.com> - 1.12.0-2
- Disable static libraries, not needed in RHEL.
* Tue May 14 2019 Pino Toscano <ptoscano@redhat.com> - 1.12.0-1
- New upstream release (RHBZ#1709416)
* Fstab: allow leading whitespaces (RHBZ#1671950)
* Thu Dec 13 2018 Pino Toscano <ptoscano@redhat.com> - 1.10.1-8
- Add simple tests (RHBZ#1653994)