[augeas-devel] augeas: master - * src/pathx.c: call make_value before pop_value
David Lutterkort
lutter at fedoraproject.org
Fri Mar 20 18:10:19 UTC 2009
Gitweb: http://git.fedorahosted.org/git/augeas.git?p=augeas.git;a=commitdiff;h=afee63affe8b6263644300003a91af5facb758a4
Commit: afee63affe8b6263644300003a91af5facb758a4
Parent: ff4286b6c5d15a41d17a1ee309c9e59993035728
Author: David Lutterkort <lutter at redhat.com>
AuthorDate: Thu Mar 19 21:11:45 2009 -0700
Committer: David Lutterkort <lutter at redhat.com>
CommitterDate: Thu Mar 19 21:11:45 2009 -0700
* src/pathx.c: call make_value before pop_value
Since make_value might realloc, pointers retrieved with pop_value may
become invalid across make_value calls.
---
src/pathx.c | 24 ++++++++++--------------
1 files changed, 10 insertions(+), 14 deletions(-)
diff --git a/src/pathx.c b/src/pathx.c
index 83a8613..332aee1 100644
--- a/src/pathx.c
+++ b/src/pathx.c
@@ -446,39 +446,36 @@ static struct value *expr_value(struct expr *expr, struct state *state) {
static void eval_expr(struct expr *expr, struct state *state);
static void func_last(struct state *state) {
- value_ind_t vind;
-
- vind = make_value(T_NUMBER, state);
+ value_ind_t vind = make_value(T_NUMBER, state);
CHECK_ERROR;
+
state->value_pool[vind].number = state->ctx_len;
push_value(vind, state);
}
static void func_position(struct state *state) {
- value_ind_t vind;
-
- vind = make_value(T_NUMBER, state);
+ value_ind_t vind = make_value(T_NUMBER, state);
CHECK_ERROR;
+
state->value_pool[vind].number = state->ctx_pos;
push_value(vind, state);
}
static void func_count(struct state *state) {
- value_ind_t vind;
- struct value *ns = pop_value(state);
-
- vind = make_value(T_NUMBER, state);
+ value_ind_t vind = make_value(T_NUMBER, state);
CHECK_ERROR;
+
+ struct value *ns = pop_value(state);
state->value_pool[vind].number = ns->nodeset->used;
push_value(vind, state);
}
static void func_label(struct state *state) {
- value_ind_t vind;
+ value_ind_t vind = make_value(T_STRING, state);
char *s;
- vind = make_value(T_STRING, state);
CHECK_ERROR;
+
if (state->ctx->label)
s = strdup(state->ctx->label);
else
@@ -553,15 +550,14 @@ static void eval_eq(struct state *state, int neq) {
}
static void eval_arith(struct state *state, enum binary_op op) {
+ value_ind_t vind = make_value(T_NUMBER, state);
struct value *r = pop_value(state);
struct value *l = pop_value(state);
- value_ind_t vind;
int res;
assert(l->tag == T_NUMBER);
assert(r->tag == T_NUMBER);
- vind = make_value(T_NUMBER, state);
CHECK_ERROR;
if (op == OP_PLUS)
More information about the augeas-devel
mailing list