This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch: FYI: fix mmap bug in natFileChannelImplPosix.cc


I'm checking this in on the trunk and the RH 4.1 branch.

This fixes a bug in how we mmap() files for use in MappedByteBufferImpl.
The bug is that if we are mapping for write, and the file is shorter
than the requested length, then we must make the file the desired
length, or else the mapped segment won't be long enough.

This fixes a bug found by the Animal Shelter Manager program (actually
by the underlying database it uses, I think).

Tom

Index: ChangeLog
from  Tom Tromey  <tromey@redhat.com>
	http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=205157
	* gnu/java/nio/channels/natFileChannelPosix.cc (mapImpl): Extend
	file, when writing, if it is too short.

Index: gnu/java/nio/channels/natFileChannelPosix.cc
===================================================================
--- gnu/java/nio/channels/natFileChannelPosix.cc	(revision 123436)
+++ gnu/java/nio/channels/natFileChannelPosix.cc	(working copy)
@@ -1,7 +1,7 @@
 
 // natFileChannelImplPosix.cc - Native part of FileChannelImpl class.
 
-/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -499,6 +499,18 @@
     {
       prot = PROT_READ|PROT_WRITE;
       flags = mmode == '+' ? MAP_SHARED : MAP_PRIVATE;
+
+      // If the file is too short, we must extend it.  While using
+      // ftruncate() to extend a file is not portable in general, it
+      // should work on all systems where you can mmap() a file.
+      struct stat st;
+      if (fstat (fd, &st) == -1)
+	throw new IOException (JvNewStringLatin1 (strerror (errno)));
+      if (position + size > st.st_size)
+	{
+	  if (ftruncate (fd, position + size) == -1)
+	    throw new IOException (JvNewStringLatin1 (strerror (errno)));
+	}
     }
   jint page_size = ::getpagesize();
   jint offset = position & ~(page_size-1);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]