Patch: FYI: fix mmap bug in natFileChannelImplPosix.cc

Tom Tromey tromey@redhat.com
Tue Apr 3 01:05:00 GMT 2007


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);



More information about the Java-patches mailing list