[XForms] NPOTDB crash on complex xpath binding expression. Bug 466712, p=dion r=jonas+aaronr

git-svn-id: svn://10.0.0.236/trunk@257539 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
aaronr%us.ibm.com
2009-06-19 17:14:41 +00:00
parent 84cf0d834b
commit 793b5b3215
2 changed files with 7 additions and 16 deletions

View File

@@ -345,8 +345,9 @@ nsXFormsXPathParser::Expr()
void
nsXFormsXPathParser::FilterExpr()
{
if (PrimaryExpr() && PeekToken() == nsXFormsXPathScanner::LBRACK) {
Predicate();
PrimaryExpr();
if (PeekToken() == nsXFormsXPathScanner::LBRACK) {
Predicate();
}
}
@@ -560,7 +561,8 @@ nsXFormsXPathParser::PathExpr()
if (DoRelative()) {
RelativeLocationPath();
} else {
XPathCompilerException("After / in a filter expression it is required to have a reletive path expression", EmptyString());
XPathCompilerException("After / in a filter expression it is required to have a relative path expression",
EmptyString());
}
}
@@ -606,7 +608,7 @@ nsXFormsXPathParser::Predicate()
RestartContext();
}
PRBool
void
nsXFormsXPathParser::PrimaryExpr()
{
nsXFormsXPathScanner::XPATHTOKEN t = PeekToken();
@@ -640,14 +642,11 @@ nsXFormsXPathParser::PrimaryExpr()
case nsXFormsXPathScanner::FUNCTIONNAME:
FunctionCall();
return PeekToken() == nsXFormsXPathScanner::SLASH || PeekToken() == nsXFormsXPathScanner::SLASHSLASH || PeekToken() == nsXFormsXPathScanner::LBRACK;
break;
default:
XPathCompilerException("Not a primary expression", mScanner.Expression(), mScanner.Offset(), mScanner.Length());
}
return PR_FALSE;
}
void
@@ -825,14 +824,6 @@ nsXFormsXPathParser::UnionExpr()
case nsXFormsXPathScanner::DOTDOT:
case nsXFormsXPathScanner::SLASH:
case nsXFormsXPathScanner::SLASHSLASH:
PathExpr();
t = PeekToken();
if (t == nsXFormsXPathScanner::UNION) {
PopToken();
UnionExpr();
}
break;
case nsXFormsXPathScanner::VARIABLE:
case nsXFormsXPathScanner::LPARAN:
case nsXFormsXPathScanner::LITERAL:

View File

@@ -90,7 +90,7 @@ private:
void OrExpr();
void PathExpr();
void Predicate();
PRBool PrimaryExpr();
void PrimaryExpr();
void RelationalExpression();
void RelativeLocationPath();
void Step();