From 4f9ad3a162d789318d55f9426ec13ddc201acf77 Mon Sep 17 00:00:00 2001 From: CasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com> Date: Tue, 29 Apr 2025 22:47:35 -0700 Subject: [PATCH] Allow truncation to work within VFileFromMemory (#3455) * Allow truncation to work within VFileFromMemory/VFileFromConstMemory Truncation here is limited to buffer size (allowing for shrinking but not growing the buffer size) * Don't change VFileFromConstMemory; have VFileFromMemory write "expand" size until the buffer size * 0 out "expanded" space --- src/util/vfs/vfs-mem.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/util/vfs/vfs-mem.c b/src/util/vfs/vfs-mem.c index 06189b886..05580f544 100644 --- a/src/util/vfs/vfs-mem.c +++ b/src/util/vfs/vfs-mem.c @@ -26,6 +26,7 @@ static ssize_t _vfmWriteNoop(struct VFile* vf, const void* buffer, size_t size); static void* _vfmMap(struct VFile* vf, size_t size, int flags); static void _vfmUnmap(struct VFile* vf, void* memory, size_t size); static void _vfmTruncate(struct VFile* vf, size_t size); +static void _vfmTruncateNoExpand(struct VFile* vf, size_t size); static void _vfmTruncateNoop(struct VFile* vf, size_t size); static ssize_t _vfmSize(struct VFile* vf); static bool _vfmSync(struct VFile* vf, void* buffer, size_t size); @@ -51,7 +52,7 @@ struct VFile* VFileFromMemory(void* mem, size_t size) { vfm->d.write = _vfmWrite; vfm->d.map = _vfmMap; vfm->d.unmap = _vfmUnmap; - vfm->d.truncate = _vfmTruncateNoop; + vfm->d.truncate = _vfmTruncateNoExpand; vfm->d.size = _vfmSize; vfm->d.sync = _vfmSync; @@ -236,8 +237,12 @@ ssize_t _vfmRead(struct VFile* vf, void* buffer, size_t size) { ssize_t _vfmWrite(struct VFile* vf, const void* buffer, size_t size) { struct VFileMem* vfm = (struct VFileMem*) vf; - if (size + vfm->offset >= vfm->size) { - size = vfm->size - vfm->offset; + if (size + vfm->offset > vfm->size) { + vfm->size = size + vfm->offset; + if (vfm->size > vfm->bufferSize) { + vfm->size = vfm->bufferSize; + size = vfm->size - vfm->offset; + } } memcpy((void*) ((uintptr_t) vfm->mem + vfm->offset), buffer, size); @@ -287,6 +292,20 @@ void _vfmTruncate(struct VFile* vf, size_t size) { _vfmExpand(vfm, size); } +void _vfmTruncateNoExpand(struct VFile* vf, size_t size) { + struct VFileMem* vfm = (struct VFileMem*) vf; + + if (size > vfm->bufferSize) { + size = vfm->bufferSize; + } + + if (size > vfm->size) { + memset((void*) ((uintptr_t) vfm->mem + vfm->size), 0, size - vfm->size); + } + + vfm->size = size; +} + void _vfmTruncateNoop(struct VFile* vf, size_t size) { // TODO: Return value? UNUSED(vf);