[jruby-joni] 98/279: Fix \k and \g IOOBEs and add warnings
Hideki Yamane
henrich at moszumanska.debian.org
Mon Nov 16 11:27:00 UTC 2015
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 <lopx at gazeta.pl>
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
More information about the pkg-java-commits
mailing list