This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: FYI: fix mmap bug in natFileChannelImplPosix.cc
- From: Tom Tromey <tromey at redhat dot com>
- To: GCJ-patches <java-patches at gcc dot gnu dot org>
- Date: 02 Apr 2007 18:49:55 -0600
- Subject: Patch: FYI: fix mmap bug in natFileChannelImplPosix.cc
- Reply-to: tromey at redhat dot com
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);