diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-08-05 09:23:05 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-08-05 09:23:05 +0000 |
commit | 7ed673ceebb0b8ae63da19e5fd850d3d03818513 (patch) | |
tree | 4fa0de0623ef46887b526b429d45aac385374da2 /src/VBox/Runtime/common/vfs | |
parent | Adding upstream version 7.0.18-dfsg. (diff) | |
download | virtualbox-upstream.tar.xz virtualbox-upstream.zip |
Adding upstream version 7.0.20-dfsg.upstream/7.0.20-dfsgupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/Runtime/common/vfs')
-rw-r--r-- | src/VBox/Runtime/common/vfs/vfsmemory.cpp | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/VBox/Runtime/common/vfs/vfsmemory.cpp b/src/VBox/Runtime/common/vfs/vfsmemory.cpp index a044f3d8..0d4f687d 100644 --- a/src/VBox/Runtime/common/vfs/vfsmemory.cpp +++ b/src/VBox/Runtime/common/vfs/vfsmemory.cpp @@ -704,10 +704,35 @@ static DECLCALLBACK(int) rtVfsMemFile_SetSize(void *pvThis, uint64_t cbFile, uin AssertReturn(RTVFSFILE_SIZE_F_IS_VALID(fFlags), VERR_INVALID_PARAMETER); PRTVFSMEMFILE pThis = (PRTVFSMEMFILE)pvThis; - if ( (fFlags & RTVFSFILE_SIZE_F_ACTION_MASK) == RTVFSFILE_SIZE_F_NORMAL - && (RTFOFF)cbFile >= pThis->Base.ObjInfo.cbObject) + if ((fFlags & RTVFSFILE_SIZE_F_ACTION_MASK) == RTVFSFILE_SIZE_F_NORMAL) { - /* Growing is just a matter of increasing the size of the object. */ + if ((RTFOFF)cbFile < pThis->Base.ObjInfo.cbObject) + { + /* Remove any extent beyond the file size. */ + bool fHit; + PRTVFSMEMEXTENT pExtent = rtVfsMemFile_LocateExtent(pThis, cbFile, &fHit); + if ( fHit + && cbFile < (pExtent->off + pExtent->cb)) + { + /* Clear the data in this extent. */ + uint64_t cbRemaining = cbFile - pExtent->off; + memset(&pExtent->abData[cbRemaining], 0, pExtent->cb - cbRemaining); + pExtent = RTListGetNext(&pThis->ExtentHead, pExtent, RTVFSMEMEXTENT, Entry); + } + + while (pExtent) + { + PRTVFSMEMEXTENT pFree = pExtent; + pExtent = RTListGetNext(&pThis->ExtentHead, pExtent, RTVFSMEMEXTENT, Entry); + + RTListNodeRemove(&pFree->Entry); + RTMemFree(pFree); + } + + pThis->pCurExt = NULL; + } + /* else: Growing is just a matter of increasing the size of the object. */ + pThis->Base.ObjInfo.cbObject = cbFile; return VINF_SUCCESS; } |