This is an automated email from the git hooks/post-receive script. henrich pushed a commit to branch debian/sid in repository jruby-joni.
commit 7c5fab4a3a73bd9c47d38bc070422a9f46ab568d Author: Marcin Mielzynski <[email protected]> Date: Fri Feb 17 00:22:43 2012 +0100 Fix \k and \g IOOBEs and add warnings --- src/org/joni/ByteCodeMachine.java | 1 + src/org/joni/Lexer.java | 128 ++++++++++++++++++++------------------ src/org/joni/ScanEnvironment.java | 6 ++ test/org/joni/test/TestA.java | 5 ++ 4 files changed, 81 insertions(+), 59 deletions(-) diff --git a/src/org/joni/ByteCodeMachine.java b/src/org/joni/ByteCodeMachine.java index aff2bff..bb2b18d 100644 --- a/src/org/joni/ByteCodeMachine.java +++ b/src/org/joni/ByteCodeMachine.java @@ -1470,6 +1470,7 @@ class ByteCodeMachine extends StackMachine { } ip += addr + 1; } + private void opPushIfPeekNext() { int addr = code[ip++]; // beyond string check diff --git a/src/org/joni/Lexer.java b/src/org/joni/Lexer.java index 9094757..311ff17 100644 --- a/src/org/joni/Lexer.java +++ b/src/org/joni/Lexer.java @@ -1038,65 +1038,70 @@ class Lexer extends ScannerSupport { case 'k': if (Config.USE_NAMED_GROUP) { if (syntax.op2EscKNamedBackref()) { - fetch(); - if (c =='<' || c == '\'') { - last = p; - int backNum; - if (Config.USE_BACKREF_WITH_LEVEL) { - int[]rbackNum = new int[1]; - int[]rlevel = new int[1]; - token.setBackrefExistLevel(fetchNameWithLevel(c, rbackNum, rlevel)); - token.setBackrefLevel(rlevel[0]); - backNum = rbackNum[0]; - } else { - backNum = fetchName(c, true); - } // USE_BACKREF_AT_LEVEL - int nameEnd = value; // set by fetchNameWithLevel/fetchName - - if (backNum != 0) { - if (backNum < 0) { - backNum = backrefRelToAbs(backNum); - if (backNum <= 0) newValueException(ERR_INVALID_BACKREF); - } + if (left()) { + fetch(); + if (c =='<' || c == '\'') { + last = p; + int backNum; + if (Config.USE_BACKREF_WITH_LEVEL) { + int[]rbackNum = new int[1]; + int[]rlevel = new int[1]; + token.setBackrefExistLevel(fetchNameWithLevel(c, rbackNum, rlevel)); + token.setBackrefLevel(rlevel[0]); + backNum = rbackNum[0]; + } else { + backNum = fetchName(c, true); + } // USE_BACKREF_AT_LEVEL + int nameEnd = value; // set by fetchNameWithLevel/fetchName + + if (backNum != 0) { + if (backNum < 0) { + backNum = backrefRelToAbs(backNum); + if (backNum <= 0) newValueException(ERR_INVALID_BACKREF); + } - if (syntax.strictCheckBackref() && (backNum > env.numMem || env.memNodes == null)) { - newValueException(ERR_INVALID_BACKREF); - } - token.type = TokenType.BACKREF; - token.setBackrefByName(false); - token.setBackrefNum(1); - token.setBackrefRef1(backNum); - } else { - NameEntry e = env.reg.nameToGroupNumbers(bytes, last, nameEnd); - if (e == null) newValueException(ERR_UNDEFINED_NAME_REFERENCE, last, nameEnd); + if (syntax.strictCheckBackref() && (backNum > env.numMem || env.memNodes == null)) { + newValueException(ERR_INVALID_BACKREF); + } + token.type = TokenType.BACKREF; + token.setBackrefByName(false); + token.setBackrefNum(1); + token.setBackrefRef1(backNum); + } else { + NameEntry e = env.reg.nameToGroupNumbers(bytes, last, nameEnd); + if (e == null) newValueException(ERR_UNDEFINED_NAME_REFERENCE, last, nameEnd); - if (syntax.strictCheckBackref()) { - if (e.backNum == 1) { - if (e.backRef1 > env.numMem || - env.memNodes == null || - env.memNodes[e.backRef1] == null) newValueException(ERR_INVALID_BACKREF); - } else { - for (int i=0; i<e.backNum; i++) { - if (e.backRefs[i] > env.numMem || + if (syntax.strictCheckBackref()) { + if (e.backNum == 1) { + if (e.backRef1 > env.numMem || env.memNodes == null || - env.memNodes[e.backRefs[i]] == null) newValueException(ERR_INVALID_BACKREF); + env.memNodes[e.backRef1] == null) newValueException(ERR_INVALID_BACKREF); + } else { + for (int i=0; i<e.backNum; i++) { + if (e.backRefs[i] > env.numMem || + env.memNodes == null || + env.memNodes[e.backRefs[i]] == null) newValueException(ERR_INVALID_BACKREF); + } } } - } - token.type = TokenType.BACKREF; - token.setBackrefByName(true); + token.type = TokenType.BACKREF; + token.setBackrefByName(true); - if (e.backNum == 1) { - token.setBackrefNum(1); - token.setBackrefRef1(e.backRef1); - } else { - token.setBackrefNum(e.backNum); - token.setBackrefRefs(e.backRefs); + if (e.backNum == 1) { + token.setBackrefNum(1); + token.setBackrefRef1(e.backRef1); + } else { + token.setBackrefNum(e.backNum); + token.setBackrefRefs(e.backRefs); + } } + } else { + unfetch(); + env.syntaxWarn("invalid back reference"); } } else { - unfetch(); + env.syntaxWarn("invalid back reference"); } } @@ -1107,17 +1112,22 @@ class Lexer extends ScannerSupport { case 'g': if (Config.USE_SUBEXP_CALL) { if (syntax.op2EscGSubexpCall()) { - fetch(); - if (c == '<' || c == '\'') { - last = p; - int gNum = fetchName(c, true); - int nameEnd = value; - token.type = TokenType.CALL; - token.setCallNameP(last); - token.setCallNameEnd(nameEnd); - token.setCallGNum(gNum); + if (left()) { + fetch(); + if (c == '<' || c == '\'') { + last = p; + int gNum = fetchName(c, true); + int nameEnd = value; + token.type = TokenType.CALL; + token.setCallNameP(last); + token.setCallNameEnd(nameEnd); + token.setCallGNum(gNum); + } else { + unfetch(); + env.syntaxWarn("invalid subexp call"); + } } else { - unfetch(); + env.syntaxWarn("invalid subexp call"); } } break; diff --git a/src/org/joni/ScanEnvironment.java b/src/org/joni/ScanEnvironment.java index 02a1ad7..53543a5 100644 --- a/src/org/joni/ScanEnvironment.java +++ b/src/org/joni/ScanEnvironment.java @@ -137,4 +137,10 @@ public final class ScanEnvironment { } } } + + void syntaxWarn(String message) { + if (Config.USE_WARN) { + reg.warnings.warn(message); + } + } } diff --git a/test/org/joni/test/TestA.java b/test/org/joni/test/TestA.java index fd58a1e..427c1d9 100644 --- a/test/org/joni/test/TestA.java +++ b/test/org/joni/test/TestA.java @@ -474,6 +474,11 @@ public class TestA extends Test { x2s("(a)b\\k<1>", "aba", 0, 3); x2s("^(?>(?=a)(a|))++$", "a", 0, 1); + x2s("\\k", "k", 0, 1); + x2s("\\kx", "kx", 0, 2); + x2s("\\g", "g", 0, 1); + x2s("\\gx", "gx", 0, 2); + x2s("\\k\\g", "kg", 0, 2); } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jruby-joni.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

