diff --git a/BurnOutSharp/External/libgsf/GsfZipImpl.cs b/BurnOutSharp/External/libgsf/GsfZipImpl.cs
index b70bc396..879f30bf 100644
--- a/BurnOutSharp/External/libgsf/GsfZipImpl.cs
+++ b/BurnOutSharp/External/libgsf/GsfZipImpl.cs
@@ -261,21 +261,19 @@ namespace LibGSF
public void Insert(string name, GsfZipDirectoryEntry dirent)
{
- GsfZipVDir child;
-
int p = name.IndexOf(GsfZipImpl.ZIP_NAME_SEPARATOR);
if (p != -1)
{
// A directory
- string dirname = name.Substring(p);
- child = ChildByName(dirname);
+ string dirname = name.Substring(0, p);
+ GsfZipVDir child = ChildByName(dirname);
if (child == null)
{
child = Create(dirname, true, null);
AddChild(child);
}
- if (name[p + 1] != '\0')
+ if (p + 1 < name.Length && name[p + 1] != '\0')
{
name = name.Substring(p + 1);
child.Insert(name, dirent);
@@ -284,7 +282,7 @@ namespace LibGSF
else
{
// A simple file name
- child = Create(name, false, dirent);
+ GsfZipVDir child = Create(name, false, dirent);
AddChild(child);
}
}
diff --git a/BurnOutSharp/External/libgsf/Input/GsfInfileTar.cs b/BurnOutSharp/External/libgsf/Input/GsfInfileTar.cs
index 8f8cad11..8a7e8d71 100644
--- a/BurnOutSharp/External/libgsf/Input/GsfInfileTar.cs
+++ b/BurnOutSharp/External/libgsf/Input/GsfInfileTar.cs
@@ -31,6 +31,7 @@ using System.Text;
namespace LibGSF.Input
{
+ // TODO: Can this be made internal?
public class TarChild
{
public string Name { get; set; }
@@ -53,6 +54,7 @@ namespace LibGSF.Input
///
/// Tar header from POSIX 1003.1-1990.
///
+ // TODO: Can this be made internal?
public class TarHeader
{
public byte[] Name { get; set; } = new byte[100]; /* 0 */
diff --git a/BurnOutSharp/External/libgsf/Input/GsfInfileZip.cs b/BurnOutSharp/External/libgsf/Input/GsfInfileZip.cs
index 3e86c0d7..541db3ea 100644
--- a/BurnOutSharp/External/libgsf/Input/GsfInfileZip.cs
+++ b/BurnOutSharp/External/libgsf/Input/GsfInfileZip.cs
@@ -32,6 +32,7 @@ using static LibGSF.GsfZipImpl;
namespace LibGSF.Input
{
+ // TODO: Can this be made internal?
public class ZipInfo
{
#region Properties
@@ -64,10 +65,10 @@ namespace LibGSF.Input
VDir.Free(false);
for (int i = 0; i < DirectoryEntries.Count; i++)
{
- GsfZipDirectoryEntry e = DirectoryEntries[i];
- e.Free();
+ DirectoryEntries[i].Free();
}
+ DirectoryEntries.Clear();
DirectoryEntries = null;
}
@@ -114,7 +115,7 @@ namespace LibGSF.Input
DupParent = dupParent;
if (DupParent != null)
{
- // Special call from zip_dup.
+ // Special call from PartiallyDuplicate.
Exception err = null;
Source = DupParent.Source.Duplicate(ref err);
Err = err;
@@ -142,10 +143,18 @@ namespace LibGSF.Input
if (source == null)
return null;
- return new GsfInfileZip
+ GsfInfileZip zip = new GsfInfileZip
{
Source = source,
};
+
+ if (zip.Err != null)
+ {
+ err = zip.Err;
+ return null;
+ }
+
+ return zip;
}
///
@@ -380,7 +389,7 @@ namespace LibGSF.Input
if (maplen == 0)
maplen = ZIP_BUF_SIZE;
- long offset = filesize - maplen; /* offset is now BUFSIZ aligned */
+ long offset = filesize - maplen; // Offset is now BUFSIZ aligned
while (true)
{
@@ -469,8 +478,8 @@ namespace LibGSF.Input
return null;
}
- ushort name_len = GSF_LE_GET_GUINT16(header, ZIP_DIRENT_NAME_SIZE);
- ushort extras_len = GSF_LE_GET_GUINT16(header, ZIP_DIRENT_EXTRAS_SIZE);
+ ushort name_len = GSF_LE_GET_GUINT16(header, ZIP_DIRENT_NAME_SIZE);
+ ushort extras_len = GSF_LE_GET_GUINT16(header, ZIP_DIRENT_EXTRAS_SIZE);
ushort comment_len = GSF_LE_GET_GUINT16(header, ZIP_DIRENT_COMMENT_SIZE);
int vlen = name_len + extras_len + comment_len;
@@ -483,30 +492,30 @@ namespace LibGSF.Input
int extraPtr = 0; // extra[0];
bool zip64 = (extra != null);
- uint flags = GSF_LE_GET_GUINT32(header, ZIP_DIRENT_FLAGS);
- GsfZipCompressionMethod compression_method = (GsfZipCompressionMethod)GSF_LE_GET_GUINT16(header, ZIP_DIRENT_COMPR_METHOD);
- uint dostime = GSF_LE_GET_GUINT32(header, ZIP_DIRENT_DOSTIME);
- uint crc32 = GSF_LE_GET_GUINT32(header, ZIP_DIRENT_CRC32);
- long csize = GSF_LE_GET_GUINT32(header, ZIP_DIRENT_CSIZE);
- long usize = GSF_LE_GET_GUINT32(header, ZIP_DIRENT_USIZE);
- long off = GSF_LE_GET_GUINT32(header, ZIP_DIRENT_OFFSET);
- uint disk_start = GSF_LE_GET_GUINT16(header, ZIP_DIRENT_DISKSTART);
+ uint flags = GSF_LE_GET_GUINT32(header, ZIP_DIRENT_FLAGS);
+ GsfZipCompressionMethod compression_method = (GsfZipCompressionMethod)GSF_LE_GET_GUINT16(header, ZIP_DIRENT_COMPR_METHOD);
+ uint dostime = GSF_LE_GET_GUINT32(header, ZIP_DIRENT_DOSTIME);
+ uint crc32 = GSF_LE_GET_GUINT32(header, ZIP_DIRENT_CRC32);
+ ulong csize = GSF_LE_GET_GUINT32(header, ZIP_DIRENT_CSIZE);
+ ulong usize = GSF_LE_GET_GUINT32(header, ZIP_DIRENT_USIZE);
+ ulong off = GSF_LE_GET_GUINT32(header, ZIP_DIRENT_OFFSET);
+ uint disk_start = GSF_LE_GET_GUINT16(header, ZIP_DIRENT_DISKSTART);
if (usize == 0xffffffffu && elen >= 8)
{
- usize = (long)GSF_LE_GET_GUINT64(extra, extraPtr);
+ usize = GSF_LE_GET_GUINT64(extra, extraPtr);
extraPtr += 8;
elen -= 8;
}
if (csize == 0xffffffffu && elen >= 8)
{
- csize = (long)GSF_LE_GET_GUINT64(extra, extraPtr);
+ csize = GSF_LE_GET_GUINT64(extra, extraPtr);
extraPtr += 8;
elen -= 8;
}
if (off == 0xffffffffu && elen >= 8)
{
- off = (long)GSF_LE_GET_GUINT64(extra, extraPtr);
+ off = GSF_LE_GET_GUINT64(extra, extraPtr);
extraPtr += 8;
elen -= 8;
}
@@ -524,14 +533,16 @@ namespace LibGSF.Input
GsfZipDirectoryEntry dirent = GsfZipDirectoryEntry.Create();
dirent.Name = Encoding.UTF8.GetString(name);
- dirent.Flags = (int)flags;
- dirent.CompressionMethod = compression_method;
- dirent.CRC32 = crc32;
- dirent.CompressedSize = csize;
- dirent.UncompressedSize = usize;
- dirent.Offset = off;
- dirent.DosTime = dostime;
- dirent.Zip64 = zip64;
+ dirent.Flags = (int)flags;
+ dirent.CompressionMethod = compression_method;
+ dirent.CRC32 = crc32;
+ dirent.CompressedSize = (long)csize;
+ dirent.UncompressedSize = (long)usize;
+ dirent.Offset = (long)off;
+ dirent.DosTime = dostime;
+ dirent.Zip64 = zip64;
+
+ //g_print("%s = 0x%x @ %" GSF_OFF_T_FORMAT "\n", name, off, *offset);
offset += ZIP_DIRENT_SIZE + vlen;
@@ -576,7 +587,7 @@ namespace LibGSF.Input
return true;
}
- int data = ZIP_ZIP64_LOCATOR_SIZE; // locator + ZIP_ZIP64_LOCATOR_SIZE
+ int data = ZIP_ZIP64_LOCATOR_SIZE; // locator[0] + ZIP_ZIP64_LOCATOR_SIZE
ulong entries = GSF_LE_GET_GUINT16(locator, data + ZIP_TRAILER_ENTRIES);
ulong dir_pos = GSF_LE_GET_GUINT32(locator, data + ZIP_TRAILER_DIR_POS);
@@ -587,7 +598,7 @@ namespace LibGSF.Input
data = 0; // locator[0]
uint disk = GSF_LE_GET_GUINT32(locator, data + ZIP_ZIP64_LOCATOR_DISK);
- ulong zip64_eod_offset = GSF_LE_GET_GUINT64(locator, data + ZIP_ZIP64_LOCATOR_OFFSET);
+ long zip64_eod_offset = (long)GSF_LE_GET_GUINT64(locator, data + ZIP_ZIP64_LOCATOR_OFFSET);
uint disks = GSF_LE_GET_GUINT32(locator, data + ZIP_ZIP64_LOCATOR_DISKS);
if (disk != 0 || disks != 1)
@@ -615,10 +626,10 @@ namespace LibGSF.Input
Info = new ZipInfo()
{
- DirectoryEntries = new List(),
- RefCount = 1,
- Entries = (uint)entries,
- DirPos = (long)dir_pos,
+ DirectoryEntries = new List(),
+ RefCount = 1,
+ Entries = (uint)entries,
+ DirPos = (long)dir_pos,
};
// Read the directory
@@ -640,7 +651,7 @@ namespace LibGSF.Input
private void BuildVirtualDirectories()
{
- Info.VDir = GsfZipVDir.Create("", true, null);
+ Info.VDir = GsfZipVDir.Create(string.Empty, true, null);
for (int i = 0; i < Info.DirectoryEntries.Count; i++)
{
GsfZipDirectoryEntry dirent = Info.DirectoryEntries[i];
@@ -664,9 +675,7 @@ namespace LibGSF.Input
return false;
}
- ///
- /// Returns true on error
- ///
+ /// Returns true on error
private bool ChildInit(ref Exception errmsg)
{
byte[] data = null;
@@ -688,8 +697,8 @@ namespace LibGSF.Input
else if (GSF_LE_GET_GUINT32(data, 0) != ZIP_HEADER_SIGNATURE)
{
err = "Error incorrect zip header";
- Console.Error.WriteLine("Header is 0x%x\n", GSF_LE_GET_GUINT32(data, 0));
- Console.Error.WriteLine("Expected 0x%x\n", ZIP_HEADER_SIGNATURE);
+ Console.Error.WriteLine($"Header is 0x{GSF_LE_GET_GUINT32(data, 0):x}");
+ Console.Error.WriteLine($"Expected 0x{ZIP_HEADER_SIGNATURE:x}");
}
if (err != null)
@@ -707,12 +716,10 @@ namespace LibGSF.Input
if (dirent.CompressionMethod != GsfZipCompressionMethod.GSF_ZIP_STORED)
{
- int errno;
-
if (Stream == null)
Stream = new ZStream();
- errno = Stream.inflateInit(-15);
+ int errno = Stream.inflateInit(-15);
if (errno != Z_OK)
{
errmsg = new Exception("Problem uncompressing stream");
@@ -739,8 +746,8 @@ namespace LibGSF.Input
return false;
CRestLen -= read_now;
- Stream.next_in = data; /* next input byte */
- Stream.avail_in = (int)read_now; /* number of bytes available at next_in */
+ Stream.next_in = data; // next input byte
+ Stream.avail_in = (int)read_now; // number of bytes available at next_in
return true;
}