I came across a few bugs compiling PhysFS with msvc9 - I've created a patch which seems to fix them:<br>SzFileReadImp / SzFileSeekImp:<br>Problem: Can't preform arithmatic on 'void *'<br>Fix: Cast 'object' to unsigned long<br>
<br>LZMA_enumerateFiles:<br>Problem: There is no error handling if the directory 'dname' doesn't exist<br>Fix: Check the return value of 'lzma_find_file()' before using it<br><br>LZMA_isDirectory:<br>
Problem: return (file->item->IsDirectory) is illegal if 'file' doesn't exist<br>Fix: Make sure 'file' isn't null before returning<br><br>---------------<br>The patch:<br><br>Index: lzma.c<br>
===================================================================<br>--- lzma.c (revision 927)<br>+++ lzma.c (working copy)<br>@@ -130,7 +130,7 @@<br> SZ_RESULT SzFileReadImp(void *object, void *buffer, size_t size,<br>
size_t *processedSize)<br> {<br>- FileInputStream *s = (FileInputStream *)(object - offsetof(FileInputStream, inStream)); // HACK!<br>+ FileInputStream *s = (FileInputStream *)((unsigned long)object - offsetof(FileInputStream, inStream)); // HACK!<br>
size_t processedSizeLoc = __PHYSFS_platformRead(s->file, buffer, 1, size);<br> if (processedSize != 0)<br> *processedSize = processedSizeLoc;<br>@@ -145,7 +145,7 @@<br> */<br> SZ_RESULT SzFileSeekImp(void *object, CFileSize pos)<br>
{<br>- FileInputStream *s = (FileInputStream *)(object - offsetof(FileInputStream, inStream)); // HACK!<br>+ FileInputStream *s = (FileInputStream *)((unsigned long)object - offsetof(FileInputStream, inStream)); // HACK!<br>
if (__PHYSFS_platformSeek(s->file, (PHYSFS_uint64) pos))<br> return SZ_OK;<br> return SZE_FAIL;<br>@@ -563,8 +563,18 @@<br> size_t dlen = strlen(dname),<br> dlen_inc = dlen + ((dlen > 0) ? 1 : 0);<br>
LZMAarchive *archive = (LZMAarchive *) opaque;<br>- LZMAfile *file = (dlen ? lzma_find_file(archive, dname) + 1 : archive->files),<br>- *lastFile = &archive->files[archive->db.Database.NumFiles];<br>
+ LZMAfile *file = NULL,<br>+ *lastFile = &archive->files[archive->db.Database.NumFiles];<br>+ if (dlen)<br>+ {<br>+ file = lzma_find_file(archive, dname);<br>+ if (file != NULL) // if 'file' is NULL it should stay so, otherwise errors will not be handled<br>
+ file += 1;<br>+ }<br>+ else<br>+ {<br>+ file = archive->files;<br>+ }<br> <br> BAIL_IF_MACRO(file == NULL, ERR_NO_SUCH_FILE, );<br> <br>@@ -620,7 +630,7 @@<br>
<br> *fileExists = (file != NULL);<br> <br>- return(file->item->IsDirectory);<br>+ return(file == NULL ? 0 : file->item->IsDirectory);<br> } /* LZMA_isDirectory */<br> <br> <br>--end of patch-----------------------------------------------------------<br>
<br>-- <br><a href="http://steelfusion.sourceforge.net">http://steelfusion.sourceforge.net</a>