From: tromey Date: Tue, 3 Apr 2007 01:05:50 +0000 (+0000) Subject: http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=205157 X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=8b37ce9e377838dcc25ba52c838308c8d32b1a0c;ds=sidebyside 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123447 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index ca939837674..9602e296f1d 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,5 +1,11 @@ 2007-04-02 Tom Tromey + 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. + +2007-04-02 Tom Tromey + https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=233406 * gnu/java/net/natPlainSocketImplPosix.cc (create): Return if already created. diff --git a/libjava/gnu/java/nio/channels/natFileChannelPosix.cc b/libjava/gnu/java/nio/channels/natFileChannelPosix.cc index 52caf828345..e05904c5026 100644 --- a/libjava/gnu/java/nio/channels/natFileChannelPosix.cc +++ b/libjava/gnu/java/nio/channels/natFileChannelPosix.cc @@ -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 @@ FileChannelImpl::mapImpl (jchar mmode, jlong position, jint size) { 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);