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 aec57665bf88769ddf84113aadf7a1e546e6a0ed Author: Charles Oliver Nutter <[email protected]> Date: Wed Dec 23 16:28:23 2009 -0600 Fix for JRUBY-4382. The fix is to ensure that a region never walks off the end of the buffer by adding a range check in opCClassNot and opCClass, similar to MRI's regex.c line 3914 on branch ruby_1_8_7@26113. --- src/org/joni/ByteCodeMachine.java | 2 ++ test/org/joni/test/TestJoni.java | 3 ++ test/org/joni/test/TestNSU8.java | 65 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/src/org/joni/ByteCodeMachine.java b/src/org/joni/ByteCodeMachine.java index bcaea73..9ca1988 100644 --- a/src/org/joni/ByteCodeMachine.java +++ b/src/org/joni/ByteCodeMachine.java @@ -623,6 +623,7 @@ class ByteCodeMachine extends StackMachine { if (s >= range || !isInBitSet()) {opFail(); return;} ip += BitSet.BITSET_SIZE; s += enc.length(bytes, s, end); /* OP_CCLASS can match mb-code. \D, \S */ + if (s > end) s = end; sprev = sbegin; // break; } @@ -672,6 +673,7 @@ class ByteCodeMachine extends StackMachine { if (s >= range || isInBitSet()) {opFail(); return;} ip += BitSet.BITSET_SIZE; s += enc.length(bytes, s, end); + if (s > end) s = end; sprev = sbegin; // break; } diff --git a/test/org/joni/test/TestJoni.java b/test/org/joni/test/TestJoni.java index 6fb14cc..f1cb9ec 100644 --- a/test/org/joni/test/TestJoni.java +++ b/test/org/joni/test/TestJoni.java @@ -7,11 +7,13 @@ public class TestJoni extends TestCase { private Test testa; private Test testc; private Test testu; + private Test testnsu8; protected void setUp() { testa = new TestA(); testc = new TestC(); testu = new TestU(); + testnsu8 = new TestNSU8(); } protected void tearDown() { @@ -33,5 +35,6 @@ public class TestJoni extends TestCase { public void testUnicode() { testJoniTest(testu); + testJoniTest(testnsu8); } } diff --git a/test/org/joni/test/TestNSU8.java b/test/org/joni/test/TestNSU8.java new file mode 100644 index 0000000..54dd902 --- /dev/null +++ b/test/org/joni/test/TestNSU8.java @@ -0,0 +1,65 @@ +/* + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package org.joni.test; + +import org.joni.Option; +import org.joni.Syntax; +import org.jcodings.Encoding; +import org.jcodings.specific.NonStrictUTF8Encoding; + +public class TestNSU8 extends Test { + + public int option() { + return Option.DEFAULT; + } + + public Encoding encoding() { + return NonStrictUTF8Encoding.INSTANCE; + } + + public String testEncoding() { + return "utf-8"; + } + + public Syntax syntax() { + return Syntax.DEFAULT; + } + + public void test() { + xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240, (byte)32, (byte)32, (byte)32, (byte)32}, 0, 5, 1, false); + xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240, (byte)32, (byte)32, (byte)32}, 0, 4, 1, false); + xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240, (byte)32, (byte)32}, 0, 3, 1, false); + xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240, (byte)32}, 0, 2, 1, false); + xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)240}, 0, 1, 1, false); + + xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)224, (byte)32, (byte)32, (byte)32}, 0, 4, 1, false); + xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)224, (byte)32, (byte)32}, 0, 3, 1, false); + xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)224, (byte)32}, 0, 2, 1, false); + xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)224}, 0, 1, 1, false); + + xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)192, (byte)32, (byte)32}, 0, 3, 1, false); + xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)192, (byte)32}, 0, 2, 1, false); + xx("([^\\[\\]]+)".getBytes(), new byte[]{(byte)192}, 0, 1, 1, false); + } + + public static void main(String[] args) throws Throwable { + new TestNSU8().run(); + } +} -- 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

