Fix a critical bug with seeking in archives

Also, other small cleanups on the way.
This commit is contained in:
Jonas Kulla 2013-10-03 22:09:01 +02:00
parent d20b652155
commit 4ddc487f17
1 changed files with 6 additions and 9 deletions

View File

@ -192,7 +192,10 @@ RGSS_ioSeek(PHYSFS_Io *self, PHYSFS_uint64 offset)
} }
/* For each 4 bytes sought, advance magic */ /* For each 4 bytes sought, advance magic */
uint64_t dwordsSought = (offset - entry->currentOffset) / 4; uint64_t currentDword = entry->currentOffset / 4;
uint64_t soughtDword = offset / 4;
uint64_t dwordsSought = soughtDword - currentDword;
for (uint64_t i = 0; i < dwordsSought; ++i) for (uint64_t i = 0; i < dwordsSought; ++i)
advanceMagic(entry->currentMagic); advanceMagic(entry->currentMagic);
@ -329,21 +332,17 @@ RGSS_enumerateFiles(void *opaque, const char *dirname,
{ {
RGSS_archiveData *data = static_cast<RGSS_archiveData*>(opaque); RGSS_archiveData *data = static_cast<RGSS_archiveData*>(opaque);
QString dirn(dirname);
char dirBuf[512]; char dirBuf[512];
char baseBuf[512];
QByteList keys = data->entryHash.keys(); QByteList keys = data->entryHash.keys();
keys += data->dirHash.keys(); keys += data->dirHash.keys();
Q_FOREACH (const QByteArray &filename, keys) Q_FOREACH (const QByteArray &filename, keys)
{ {
/* Get the filename directory part */ /* Get the filename directory part */
strcpy(dirBuf, filename.constData()); strncpy(dirBuf, filename.constData(), sizeof(dirBuf));
strcpy(baseBuf, filename.constData());
/* Extract path and basename */ /* Extract path and basename */
const char *dirpath = ""; const char *dirpath = ".";
char *basename = dirBuf; char *basename = dirBuf;
for (int i = filename.size(); i >= 0; i--) for (int i = filename.size(); i >= 0; i--)
@ -609,8 +608,6 @@ struct FileSystemPrivate
if (!handle) if (!handle)
throw Exception(Exception::PHYSFSError, "PhysFS: %s", PHYSFS_getLastError()); throw Exception(Exception::PHYSFSError, "PhysFS: %s", PHYSFS_getLastError());
PHYSFS_fileLength(handle);
return handle; return handle;
} }
}; };