diff --git a/rpmio/expression.c b/rpmio/expression.c index 25db127683..3da1bead30 100644 --- a/rpmio/expression.c +++ b/rpmio/expression.c @@ -402,6 +402,7 @@ static Value doPrimary(ParseState state) goto err; default: + exprErr(state, _("syntax error in expression"), state->p); goto err; break; } @@ -705,9 +706,9 @@ static Value doTernary(ParseState state) default: goto err; } - valueFree(v1); if (rdToken(state)) goto err; + valueFree(v1); v1 = doTernary(state); if (v1 == NULL) goto err; @@ -735,7 +736,7 @@ int rpmExprBool(const char *expr) { struct _parseState state; int result = -1; - Value v; + Value v = NULL; DEBUG(printf("parseExprBoolean(?, '%s')\n", expr)); @@ -743,7 +744,8 @@ int rpmExprBool(const char *expr) state.p = state.str = xstrdup(expr); state.nextToken = 0; state.tokenValue = NULL; - (void) rdToken(&state); + if (rdToken(&state)) + goto exit; /* Parse the expression. */ v = doTernary(&state); @@ -779,7 +781,7 @@ char *rpmExprStr(const char *expr) { struct _parseState state; char *result = NULL; - Value v; + Value v = NULL; DEBUG(printf("parseExprString(?, '%s')\n", expr)); @@ -787,7 +789,8 @@ char *rpmExprStr(const char *expr) state.p = state.str = xstrdup(expr); state.nextToken = 0; state.tokenValue = NULL; - (void) rdToken(&state); + if (rdToken(&state)) + goto exit; /* Parse the expression. */ v = doTernary(&state); diff --git a/tests/rpmmacro.at b/tests/rpmmacro.at index 9ecff1662a..8ebea77588 100644 --- a/tests/rpmmacro.at +++ b/tests/rpmmacro.at @@ -276,6 +276,8 @@ runroot rpm --eval '%{expr:"a"=!"b"}' runroot rpm --eval '%{expr:4+}' runroot rpm --eval '%{expr:bare}' runroot rpm --eval '%{expr:1/0}' +runroot rpm --eval '%{expr:0 < 1 ? "a" : 1*"a"}' +runroot rpm --eval '%{expr:0 < 1 ? 1*"a" : "a"}' ], [1], [], @@ -288,6 +290,8 @@ error: unexpected end of expression: 4+ error: bare words are no longer supported, please use "...": bare error: ^ error: division by zero: 1/0 +error: types must match: 0 < 1 ? "a" : 1*"a" +error: types must match: 0 < 1 ? 1*"a" : "a" ]) AT_CLEANUP