[augeas-devel] augeas: master - * src/pathx.c (expand_tree): ensure we start with a nonempty lp_trace
David Lutterkort
lutter at fedoraproject.org
Tue Mar 24 23:07:56 UTC 2009
Gitweb: http://git.fedorahosted.org/git/augeas.git?p=augeas.git;a=commitdiff;h=b58b000de577a818c04a1961428d8831a9f94083
Commit: b58b000de577a818c04a1961428d8831a9f94083
Parent: f14e32d980fe181e0199655a5f3797016cf0568a
Author: David Lutterkort <lutter at redhat.com>
AuthorDate: Mon Mar 23 18:17:23 2009 -0700
Committer: David Lutterkort <lutter at redhat.com>
CommitterDate: Tue Mar 24 15:54:01 2009 -0700
* src/pathx.c (expand_tree): ensure we start with a nonempty lp_trace
---
src/pathx.c | 20 ++++++++++++++++----
tests/test-xpath.c | 21 +++++++++++++++++++++
2 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/src/pathx.c b/src/pathx.c
index c9f6dbe..3fe9e96 100644
--- a/src/pathx.c
+++ b/src/pathx.c
@@ -41,7 +41,8 @@ static const char *const errcodes[] = {
"internal error", /* PATHX_EINTERNAL */
"type error", /* PATHX_ETYPE */
"undefined variable", /* PATHX_ENOVAR */
- "garbage at end of path expression" /* PATHX_EEND */
+ "garbage at end of path expression",/* PATHX_EEND */
+ "can not expand tree from empty nodeset" /* PATHX_ENONODES */
};
/*
@@ -2066,14 +2067,27 @@ int pathx_expand_tree(struct pathx *path, struct tree **tree) {
int r;
struct step *step;
struct locpath_trace lpt;
+ struct tree *first_child = NULL;
+ struct value *v = NULL;
MEMZERO(&lpt, 1);
path->state->locpath_trace = &lpt;
- pathx_eval(path);
+ v = pathx_eval(path);
path->state->locpath_trace = NULL;
if (HAS_ERROR(path->state))
goto error;
+ if (lpt.maxns == 0) {
+ if (v->tag != T_NODESET || v->nodeset->used == 0) {
+ STATE_ERROR(path->state, PATHX_ENONODES);
+ goto error;
+ }
+ if (v->nodeset->used > 1)
+ goto error;
+ *tree = v->nodeset->nodes[0];
+ return 0;
+ }
+
*tree = path->origin;
r = locpath_search(&lpt, tree, &step);
if (r == -1)
@@ -2082,9 +2096,7 @@ int pathx_expand_tree(struct pathx *path, struct tree **tree) {
if (step == NULL)
return 0;
- struct tree *first_child = NULL;
struct tree *parent = *tree;
-
if (parent == NULL)
parent = path->origin;
diff --git a/tests/test-xpath.c b/tests/test-xpath.c
index d972738..9cfb8ab 100644
--- a/tests/test-xpath.c
+++ b/tests/test-xpath.c
@@ -226,6 +226,24 @@ static int test_rm_var(struct augeas *aug) {
return -1;
}
+static int test_defvar_nonexistent(struct augeas *aug) {
+ int r;
+
+ printf("%-30s ... ", "defvar_nonexistent");
+ r = aug_defvar(aug, "x", "/foo/bar");
+ if (r < 0)
+ die("aug_defvar failed");
+
+ r = aug_set(aug, "$x", "baz");
+ if (r != -1)
+ goto fail;
+ printf("PASS\n");
+ return 0;
+ fail:
+ printf("FAIL\n");
+ return -1;
+}
+
static int run_tests(struct test *tests) {
char *lensdir;
struct augeas *aug = NULL;
@@ -252,6 +270,9 @@ static int run_tests(struct test *tests) {
if (test_rm_var(aug) < 0)
result = EXIT_FAILURE;
+ if (test_defvar_nonexistent(aug) < 0)
+ result = EXIT_FAILURE;
+
aug_close(aug);
return result;
More information about the augeas-devel
mailing list