[jruby-joni] 84/223: Fix \k and \g IOOBEs and add warnings

Hideki Yamane henrich at moszumanska.debian.org
Mon Nov 16 11:21:52 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