Skip to content

Commit 71be728

Browse files
committed
Take SeekPos into account for read/write operations
1 parent 86a2a6b commit 71be728

File tree

3 files changed

+46
-12
lines changed

3 files changed

+46
-12
lines changed

include/vfspp/MemoryFile.hpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -273,11 +273,11 @@ class MemoryFile final : public IFile
273273
if (origin == Origin::Begin) {
274274
m_SeekPos = offset;
275275
} else if (origin == Origin::End) {
276-
m_SeekPos = Size() - offset;
276+
m_SeekPos = (offset <= SizeST()) ? SizeST() - offset : 0;
277277
} else if (origin == Origin::Set) {
278278
m_SeekPos += offset;
279279
}
280-
m_SeekPos = std::min(m_SeekPos, Size() - 1);
280+
m_SeekPos = std::min(m_SeekPos, SizeST());
281281

282282
return TellST();
283283
}
@@ -301,7 +301,8 @@ class MemoryFile final : public IFile
301301
uint64_t leftSize = SizeST() - TellST();
302302
uint64_t maxSize = std::min(size, leftSize);
303303
if (maxSize > 0) {
304-
memcpy(buffer, m_Data.data(), static_cast<size_t>(maxSize));
304+
memcpy(buffer, m_Data.data() + m_SeekPos, static_cast<size_t>(maxSize));
305+
m_SeekPos += maxSize;
305306
return maxSize;
306307
}
307308

@@ -321,9 +322,14 @@ class MemoryFile final : public IFile
321322

322323
uint64_t leftSize = SizeST() - TellST();
323324
if (size > leftSize) {
324-
m_Data.resize((size_t)(m_Data.size() + (size - leftSize)));
325+
uint64_t newSize = TellST() + size;
326+
if (newSize > static_cast<uint64_t>(std::numeric_limits<size_t>::max())) {
327+
return 0;
328+
}
329+
m_Data.resize(static_cast<size_t>(newSize));
325330
}
326331
memcpy(m_Data.data() + TellST(), buffer, static_cast<size_t>(size));
332+
m_SeekPos += size;
327333

328334
return size;
329335
}

include/vfspp/NativeFile.hpp

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,12 @@ class NativeFile final : public IFile
290290
dir = std::ios_base::cur;
291291
}
292292

293+
// Seek both read and write pointers to keep them synchronized
293294
m_Stream.seekg(offset, dir);
295+
m_Stream.seekp(offset, dir);
296+
294297
if (m_Stream.fail()) {
298+
m_Stream.clear();
295299
return 0;
296300
}
297301

@@ -300,7 +304,19 @@ class NativeFile final : public IFile
300304

301305
inline uint64_t TellST()
302306
{
303-
return static_cast<uint64_t>(m_Stream.tellg());
307+
if (!IsOpenedST()) {
308+
return 0;
309+
}
310+
311+
if ((m_Mode & FileMode::Read) == FileMode::Read) {
312+
auto pos = m_Stream.tellg();
313+
return (pos != std::streampos(-1)) ? static_cast<uint64_t>(pos) : 0;
314+
} else if ((m_Mode & FileMode::Write) == FileMode::Write) {
315+
auto pos = m_Stream.tellp();
316+
return (pos != std::streampos(-1)) ? static_cast<uint64_t>(pos) : 0;
317+
}
318+
319+
return 0;
304320
}
305321

306322
inline uint64_t ReadST(uint8_t* buffer, uint64_t size)
@@ -313,13 +329,17 @@ class NativeFile final : public IFile
313329
if ((m_Mode & FileMode::Read) != FileMode::Read) {
314330
return 0;
315331
}
316-
317-
332+
318333
uint64_t leftSize = SizeST() - TellST();
319334
uint64_t maxSize = std::min(size, leftSize);
320335
if (maxSize > 0) {
321336
m_Stream.read(reinterpret_cast<char*>(buffer), maxSize);
322-
return maxSize;
337+
if (m_Stream.good() || m_Stream.eof()) {
338+
return static_cast<uint64_t>(m_Stream.gcount());
339+
}
340+
// Clear error flags for failed read
341+
m_Stream.clear();
342+
return 0;
323343
}
324344

325345
return 0;
@@ -337,7 +357,10 @@ class NativeFile final : public IFile
337357
}
338358

339359
m_Stream.write(reinterpret_cast<const char*>(buffer), size);
340-
return static_cast<uint64_t>(m_Stream.gcount());
360+
if (m_Stream.good()) {
361+
return size;
362+
}
363+
return 0;
341364
}
342365

343366
inline uint64_t ReadST(std::vector<uint8_t>& buffer, uint64_t size)

include/vfspp/ZipFile.hpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,10 @@ class ZipFile final : public IFile
253253

254254
m_Data.resize(m_Size);
255255
m_IsOpened = mz_zip_reader_extract_to_mem_no_alloc(zipArchive.get(), m_EntryID, m_Data.data(), static_cast<size_t>(m_Size), 0, 0, 0);
256+
257+
if (!m_IsOpened) {
258+
m_Data.clear();
259+
}
256260
}
257261

258262
inline void CloseST()
@@ -277,11 +281,11 @@ class ZipFile final : public IFile
277281
if (origin == IFile::Origin::Begin) {
278282
m_SeekPos = offset;
279283
} else if (origin == IFile::Origin::End) {
280-
m_SeekPos = SizeST() - offset;
284+
m_SeekPos = (offset <= SizeST()) ? SizeST() - offset : 0;
281285
} else if (origin == IFile::Origin::Set) {
282286
m_SeekPos += offset;
283287
}
284-
m_SeekPos = std::min(m_SeekPos, SizeST() - 1);
288+
m_SeekPos = std::min(m_SeekPos, SizeST());
285289

286290
return TellST();
287291
}
@@ -300,7 +304,8 @@ class ZipFile final : public IFile
300304
uint64_t leftSize = SizeST() - TellST();
301305
uint64_t maxSize = std::min(size, leftSize);
302306
if (maxSize > 0) {
303-
memcpy(buffer, m_Data.data(), static_cast<size_t>(maxSize));
307+
memcpy(buffer, m_Data.data() + m_SeekPos, static_cast<size_t>(maxSize));
308+
m_SeekPos += maxSize;
304309
return maxSize;
305310
}
306311

0 commit comments

Comments
 (0)