Updated server-FileEndOfFileInformation patchset, growing a memory mapped file should still work.

This commit is contained in:
Sebastian Lackner 2015-10-31 21:12:40 +01:00
parent 4be7c872c3
commit d4e3581847
3 changed files with 59 additions and 0 deletions

2
debian/changelog vendored
View File

@ -1,4 +1,6 @@
wine-staging (1.7.54) UNRELEASED; urgency=low
* Updated server-FileEndOfFileInformation patchset, growing a memory mapped
file should still work.
* Added patch to use wrapper function for consolidation callback during
unwinding.
* Added patch to implement stub for ProcessQuotaLimits info class.

View File

@ -4809,8 +4809,10 @@ fi
# |
if test "$enable_server_FileEndOfFileInformation" -eq 1; then
patch_apply server-FileEndOfFileInformation/0001-ntdll-Set-EOF-on-file-which-has-a-memory-mapping-sho.patch
patch_apply server-FileEndOfFileInformation/0002-server-Growing-files-which-are-mapped-to-memory-shou.patch
(
echo '+ { "Qian Hong", "ntdll: Set EOF on file which has a memory mapping should fail.", 1 },';
echo '+ { "Sebastian Lackner", "server: Growing files which are mapped to memory should still work.", 1 },';
) >> "$patchlist"
fi

View File

@ -0,0 +1,55 @@
From 70e97a724ec17b2e78333eb79d25a443defca13c Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sat, 31 Oct 2015 21:11:23 +0100
Subject: server: Growing files which are mapped to memory should still work.
---
server/fd.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/server/fd.c b/server/fd.c
index f91659d..144f04a 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -2366,14 +2366,23 @@ static void set_fd_eof( struct fd *fd, file_pos_t eof )
return;
}
- /* can't set eof of files which are mapped to memory */
- LIST_FOR_EACH( ptr, &fd->inode->open )
+ if (fstat( fd->unix_fd, &st ) == -1)
{
- struct fd *fd_ptr = LIST_ENTRY( ptr, struct fd, inode_entry );
- if (fd_ptr != fd && (fd_ptr->access & FILE_MAPPING_ACCESS))
+ file_set_error();
+ return;
+ }
+
+ /* can't truncate files which are mapped to memory */
+ if (eof < st.st_size)
+ {
+ LIST_FOR_EACH( ptr, &fd->inode->open )
{
- set_error( STATUS_USER_MAPPED_FILE );
- return;
+ struct fd *fd_ptr = LIST_ENTRY( ptr, struct fd, inode_entry );
+ if (fd_ptr != fd && (fd_ptr->access & FILE_MAPPING_ACCESS))
+ {
+ set_error( STATUS_USER_MAPPED_FILE );
+ return;
+ }
}
}
@@ -2381,7 +2390,7 @@ static void set_fd_eof( struct fd *fd, file_pos_t eof )
if (ftruncate( fd->unix_fd, eof ) != -1) return;
/* now check for the need to extend the file */
- if (fstat( fd->unix_fd, &st ) != -1 && eof > st.st_size)
+ if (eof > st.st_size)
{
/* extend the file one byte beyond the requested size and then truncate it */
/* this should work around ftruncate implementations that can't extend files */
--
2.6.1