From mboxrd@z Thu Jan 1 00:00:00 1970 From: jwnimmer@alum.mit.edu To: gcc-gnats@gcc.gnu.org Subject: libgcj/3523: java.io.LineNumberReader has a buggy reset() method. Date: Sun, 01 Jul 2001 19:56:00 -0000 Message-id: <20010702025138.11271.qmail@sourceware.cygnus.com> X-SW-Source: 2001-07/msg00019.html List-Id: >Number: 3523 >Category: libgcj >Synopsis: java.io.LineNumberReader has a buggy reset() method. >Confidential: no >Severity: non-critical >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sun Jul 01 19:56:00 PDT 2001 >Closed-Date: >Last-Modified: >Originator: Jeremy Nimmer >Release: gcc version 3.1 20010630 (experimental) >Organization: >Environment: i686-pc-linux-gnu, configured with: configure --enable-threads=posix --enable-shared --enable-languages=c++,java >Description: The implementation of the reset() method in java.io.LineNumberReader passes invalid arguments to the countLines method, causing it to index the array out of bounds under certain circumstances. >How-To-Repeat: Compile this program to bytecode (with javac, jikes, or gcj) and then run with gij. import java.io.*; public class CrashLNR { public static void main(String[] args) throws Exception { String s = "123456789\n123456789\n1234\n1234\n"; LineNumberReader r = new LineNumberReader(new StringReader(s), 35); r.readLine(); r.readLine(); r.mark(10); r.readLine(); r.reset(); // exception } } >Fix: Here is my suggested patch, but I have not tested it thoroughly. % diff -u LineNumberReader.java LineNumberReader.java.fixed --- LineNumberReader.java Tue Mar 7 14:55:26 2000 +++ LineNumberReader.java.fixed Sun Jul 1 22:27:14 2001 @@ -94,7 +94,7 @@ if (markPos > 0 && pos > markPos && buffer[markPos-1] == '\r' && buffer[markPos] == '\n') lineNumber--; - lineNumber -= countLines(buffer, pos, markPos); + lineNumber -= countLines(buffer, markPos, pos-markPos); pos = markPos; } } >Release-Note: >Audit-Trail: >Unformatted: