ole32: Don't store file size in FileLockBytesImpl.

Vincent Povirk madewokherd at gmail.com
Wed May 28 10:27:26 CDT 2014


Previous version didn't apply, sorry.
-------------- next part --------------
From fc29d7b542414b8806f9475b8a179d647b0ee816 Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Tue, 27 May 2014 14:14:45 -0500
Subject: [PATCH 1/3] ole32: Don't store file size in FileLockBytesImpl.

If we have other writers, they may change the size.
---
 dlls/ole32/filelockbytes.c | 23 +++--------------------
 1 file changed, 3 insertions(+), 20 deletions(-)

diff --git a/dlls/ole32/filelockbytes.c b/dlls/ole32/filelockbytes.c
index 9bd1163..52c1d26 100644
--- a/dlls/ole32/filelockbytes.c
+++ b/dlls/ole32/filelockbytes.c
@@ -49,7 +49,6 @@ typedef struct FileLockBytesImpl
 {
     ILockBytes ILockBytes_iface;
     LONG ref;
-    ULARGE_INTEGER filesize;
     HANDLE hfile;
     DWORD flProtect;
     LPWSTR pwcsName;
@@ -108,8 +107,6 @@ HRESULT FileLockBytesImpl_Construct(HANDLE hFile, DWORD openFlags, LPCWSTR pwcsN
   This->ILockBytes_iface.lpVtbl = &FileLockBytesImpl_Vtbl;
   This->ref = 1;
   This->hfile = hFile;
-  This->filesize.u.LowPart = GetFileSize(This->hfile,
-					 &This->filesize.u.HighPart);
   This->flProtect = GetProtectMode(openFlags);
 
   if(pwcsName) {
@@ -129,8 +126,6 @@ HRESULT FileLockBytesImpl_Construct(HANDLE hFile, DWORD openFlags, LPCWSTR pwcsN
   else
     This->pwcsName = NULL;
 
-  TRACE("file len %u\n", This->filesize.u.LowPart);
-
   *pLockBytes = &This->ILockBytes_iface;
 
   return S_OK;
@@ -248,7 +243,6 @@ static HRESULT WINAPI FileLockBytesImpl_WriteAt(
       ULONG*         pcbWritten)  /* [out] */
 {
     FileLockBytesImpl* This = impl_from_ILockBytes(iface);
-    ULONG size_needed = ulOffset.u.LowPart + cb;
     ULONG bytes_left = cb;
     const BYTE *writePtr = pv;
     BOOL ret;
@@ -266,14 +260,6 @@ static HRESULT WINAPI FileLockBytesImpl_WriteAt(
     if (pcbWritten)
         *pcbWritten = 0;
 
-    if (size_needed > This->filesize.u.LowPart)
-    {
-        ULARGE_INTEGER newSize;
-        newSize.u.HighPart = 0;
-        newSize.u.LowPart = size_needed;
-        ILockBytes_SetSize(iface, newSize);
-    }
-
     offset.QuadPart = ulOffset.QuadPart;
 
     ret = SetFilePointerEx(This->hfile, offset, NULL, FILE_BEGIN);
@@ -316,10 +302,7 @@ static HRESULT WINAPI FileLockBytesImpl_SetSize(ILockBytes* iface, ULARGE_INTEGE
     HRESULT hr = S_OK;
     LARGE_INTEGER newpos;
 
-    if (This->filesize.u.LowPart == newSize.u.LowPart)
-        return hr;
-
-    TRACE("from %u to %u\n", This->filesize.u.LowPart, newSize.u.LowPart);
+    TRACE("new size %u\n", newSize.u.LowPart);
 
     newpos.QuadPart = newSize.QuadPart;
     if (SetFilePointerEx(This->hfile, newpos, NULL, FILE_BEGIN))
@@ -327,7 +310,6 @@ static HRESULT WINAPI FileLockBytesImpl_SetSize(ILockBytes* iface, ULARGE_INTEGE
         SetEndOfFile(This->hfile);
     }
 
-    This->filesize = newSize;
     return hr;
 }
 
@@ -412,7 +394,8 @@ static HRESULT WINAPI FileLockBytesImpl_Stat(ILockBytes* iface,
         pstatstg->pwcsName = NULL;
 
     pstatstg->type = STGTY_LOCKBYTES;
-    pstatstg->cbSize = This->filesize;
+
+    pstatstg->cbSize.u.LowPart = GetFileSize(This->hfile, &pstatstg->cbSize.u.HighPart);
     /* FIXME: If the implementation is exported, we'll need to set other fields. */
 
     return S_OK;
-- 
1.8.3.2



More information about the wine-patches mailing list