You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2010/09/21 07:04:19 UTC

svn commit: r999223 - in /lucene/dev/trunk/lucene: CHANGES.txt src/java/org/apache/lucene/store/MMapDirectory.java

Author: rmuir
Date: Tue Sep 21 05:04:19 2010
New Revision: 999223

URL: http://svn.apache.org/viewvc?rev=999223&view=rev
Log:
LUCENE-2650: Added extra safety to MMapIndexInput clones

Modified:
    lucene/dev/trunk/lucene/CHANGES.txt
    lucene/dev/trunk/lucene/src/java/org/apache/lucene/store/MMapDirectory.java

Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=999223&r1=999222&r2=999223&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Tue Sep 21 05:04:19 2010
@@ -526,6 +526,9 @@ Bug fixes
 * LUCENE-2634: isCurrent on an NRT reader was failing to return false
   if the writer had just committed (Nikolay Zamosenchuk via Mike McCandless)
 
+* LUCENE-2650: Added extra safety to MMapIndexInput clones to prevent accessing
+  an unmapped buffer if the input is closed (Mike McCandless, Uwe Schindler, Robert Muir) 
+
 New features
 
 * LUCENE-2128: Parallelized fetching document frequencies during weight

Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/store/MMapDirectory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/store/MMapDirectory.java?rev=999223&r1=999222&r2=999223&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/store/MMapDirectory.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/store/MMapDirectory.java Tue Sep 21 05:04:19 2010
@@ -259,6 +259,8 @@ public class MMapDirectory extends FSDir
 
     @Override
     public Object clone() {
+      if (buffer == null)
+        throw new AlreadyClosedException("MMapIndexInput already closed");
       MMapIndexInput clone = (MMapIndexInput)super.clone();
       clone.isClone = true;
       clone.buffer = buffer.duplicate();
@@ -267,9 +269,9 @@ public class MMapDirectory extends FSDir
 
     @Override
     public void close() throws IOException {
-      if (isClone || buffer == null) return;
       // unmap the buffer (if enabled) and at least unset it for GC
       try {
+        if (isClone || buffer == null) return;
         cleanMapping(buffer);
       } finally {
         buffer = null;
@@ -382,6 +384,8 @@ public class MMapDirectory extends FSDir
   
     @Override
     public Object clone() {
+      if (buffers == null)
+        throw new AlreadyClosedException("MultiMMapIndexInput already closed");
       MultiMMapIndexInput clone = (MultiMMapIndexInput)super.clone();
       clone.isClone = true;
       clone.buffers = new ByteBuffer[buffers.length];
@@ -403,8 +407,8 @@ public class MMapDirectory extends FSDir
   
     @Override
     public void close() throws IOException {
-      if (isClone || buffers == null) return;
       try {
+        if (isClone || buffers == null) return;
         for (int bufNr = 0; bufNr < buffers.length; bufNr++) {
           // unmap the buffer (if enabled) and at least unset it for GC
           try {