#include "zarchive.h"
-static char *methods[] =
+static const char *methods[] =
{
LZHUFF0_METHOD, LZHUFF1_METHOD, LZHUFF2_METHOD, LZHUFF3_METHOD,
LZHUFF4_METHOD, LZHUFF5_METHOD, LZHUFF6_METHOD, LZHUFF7_METHOD,
_tzset();
zv = zvolume_alloc (zf, ArchiveFormatLHA, NULL, NULL);
while (get_header(zf, &hdr)) {
- struct znode *zn;
- int method;
+ struct znode *zn;
+ int method;
- for (i = 0; methods[i]; i++) {
- if (!strcmp (methods[i], hdr.method))
- method = i;
- }
- memset (&zai, 0, sizeof zai);
- zai.name = au (hdr.name);
- zai.size = hdr.original_size;
- zai.flags = hdr.attribute;
- if (hdr.extend_type != 0) {
- zai.tv.tv_sec = hdr.unix_last_modified_stamp -= _timezone;
- } else {
- struct tm t;
- uae_u32 v = hdr.last_modified_stamp;
-
- t.tm_sec = (v & 0x1f) * 2;
- t.tm_min = (v >> 5) & 0x3f;
- t.tm_hour = (v >> 11) & 0x1f;
- t.tm_mday = (v >> 16) & 0x1f;
- t.tm_mon = ((v >> 21) & 0xf) - 1;
- t.tm_year = ((v >> 25) & 0x7f) + 80;
- zai.tv.tv_sec = mktime (&t) - _timezone;
- }
- if (hdr.name[strlen(hdr.name) + 1] != 0)
- zai.comment = au (&hdr.name[strlen(hdr.name) + 1]);
- if (method == LZHDIRS_METHOD_NUM) {
- zvolume_adddir_abs (zv, &zai);
- } else {
- zn = zvolume_addfile_abs (zv, &zai);
- zn->offset = zfile_ftell(zf);
- zn->packedsize = hdr.packed_size;
- zn->method = method;
- }
- xfree (zai.name);
- xfree (zai.comment);
- zfile_fseek (zf, hdr.packed_size, SEEK_CUR);
+ for (i = 0; methods[i]; i++) {
+ if (!strcmp (methods[i], hdr.method))
+ method = i;
+ }
+ memset (&zai, 0, sizeof zai);
+ zai.name = au (hdr.name);
+ zai.size = hdr.original_size;
+ zai.flags = hdr.attribute;
+ if (hdr.extend_type != 0) {
+ zai.tv.tv_sec = hdr.unix_last_modified_stamp -= _timezone;
+ } else {
+ struct tm t;
+ uae_u32 v = hdr.last_modified_stamp;
+ t.tm_sec = (v & 0x1f) * 2;
+ t.tm_min = (v >> 5) & 0x3f;
+ t.tm_hour = (v >> 11) & 0x1f;
+ t.tm_mday = (v >> 16) & 0x1f;
+ t.tm_mon = ((v >> 21) & 0xf) - 1;
+ t.tm_year = ((v >> 25) & 0x7f) + 80;
+ zai.tv.tv_sec = mktime (&t) - _timezone;
+ }
+ if (hdr.name[strlen(hdr.name) + 1] != 0)
+ zai.comment = au (&hdr.name[strlen(hdr.name) + 1]);
+ if (method == LZHDIRS_METHOD_NUM) {
+ zvolume_adddir_abs (zv, &zai);
+ } else {
+ zn = zvolume_addfile_abs (zv, &zai);
+ if (zn) {
+ zn->offset = zfile_ftell(zf);
+ zn->packedsize = hdr.packed_size;
+ zn->method = method;
+ }
+ }
+ xfree (zai.name);
+ xfree (zai.comment);
+ zfile_fseek (zf, hdr.packed_size, SEEK_CUR);
}
return zv;
}
}
/* pre-cache all files we just decompressed */
for (;;) {
- if (znfirst->size && !znfirst->f) {
+ if (!znfirst->f) {
dstf = zfile_fopen_empty (zf, znfirst->name, znfirst->size);
- zfile_fwrite(dbuf + znfirst->offset2, znfirst->size, 1, dstf);
+ if (znfirst->size) {
+ zfile_fwrite(dbuf + znfirst->offset2, znfirst->size, 1, dstf);
+ }
znfirst->f = dstf;
if (znfirst == zn)
- newzf = zfile_dup (dstf);
+ newzf = zfile_dup (dstf);
+ } else {
+ if (znfirst == zn)
+ newzf = zfile_dup(znfirst->f);
}
if (znfirst == znlast)
break;
tm.tm_mday = day;
zai.tv.tv_sec = mktime(&tm);
zai.size = unpack_size;
+
zn = zvolume_addfile_abs(zv, &zai);
- zn->offset2 = merge_size;
+ if (zn) {
+ zn->offset2 = merge_size;
+ }
xfree (zai.name);
xfree (zai.comment);
if(pack_size) /* seek past the packed data */
{
merge_size = 0;
- zn->offset = zfile_ftell(in_file);
- zn->packedsize = pack_size;
+ if (zn) {
+ zn->offset = zfile_ftell(in_file);
+ zn->packedsize = pack_size;
+ }
if(!zfile_fseek(in_file, pack_size, SEEK_CUR))
{
abort = 0; /* continue */
}
}
+static bool valid_zi(struct zarchive_info *zai)
+{
+ if (_tcslen(zai->name) == 0) {
+ return false;
+ }
+ return true;
+}
+
struct znode *znode_adddir (struct znode *parent, const TCHAR *name, struct zarchive_info *zai)
{
struct znode *zn;
if (last == '/' || last == '\\')
path[_tcslen (path) - 1] = 0;
}
+ if (!valid_zi(zai)) {
+ xfree(path);
+ return NULL;
+ }
zn2 = &zv->root;
p = p2 = path;
for (i = 0; path[i]; i++) {
{
struct znode *zn = NULL, *zn2;
int i;
- TCHAR *path = my_strdup (zai->name);
+ TCHAR *path = my_strdup(zai->name);
TCHAR *p, *p2;
zn2 = &zv->root;
p = p2 = &path[i + 1];
}
}
- if (p2) {
+ if (p2 && _tcslen(p2) > 0) {
zn = znode_alloc_child (zn2, p2);
zn->size = zai->size;
zn->type = ZNODE_FILE;
}
if (!f->IsDir) {
struct znode *zn = zvolume_addfile_abs (zv, &zai);
- zn->offset = i;
+ if (zn)
+ zn->offset = i;
}
}
zv->method = ArchiveFormat7Zip;
zai.flags = -1;
zai.tv.tv_sec = fromdostime (rc->HeaderData.FileTime);
zn = zvolume_addfile_abs (zv, &zai);
- zn->offset = cnt++;
+ if (zn)
+ zn->offset = cnt++;
pRARProcessFile (rc->hArcData, RAR_SKIP, NULL, NULL);
}
pRARCloseArchive (rc->hArcData);
zai.flags = -1;
zai.size = (unsigned int)fi.UncompressedFileSize;
zn = zvolume_addfile_abs (zv, &zai);
- xfree (name);
- zn->offset = f;
- zn->method = id;
+ if (zn) {
+ zn->offset = f;
+ zn->method = id;
+ }
+ xfree(name);
if (id == ArchiveFormat7Zip) {
if (fi.CompressedFileSize)
zai.size = zfile_ftell (zf2);
zfile_fseek (zf2, 0, SEEK_SET);
zn = zvolume_addfile_abs (zv, &zai);
- zn->f = zf2;
+ if (zn)
+ zn->f = zf2;
// if (zn)
// zn->offset = index + 1;
// zfile_fclose (zf2);
amiga_to_timeval (&zai.tv, gl (adf, bs - 23 * 4), gl (adf, bs - 22 * 4),gl (adf, bs - 21 * 4), 50);
if (secondary == -3) {
struct znode *znnew = zvolume_addfile_abs (zv, &zai);
- znnew->offset = block;
+ if (znnew)
+ znnew->offset = block;
} else {
struct znode *znnew = zvolume_adddir_abs (zv, &zai);
- znnew->offset = block;
- recurseadf (znnew, block, name2);
+ if (znnew) {
+ znnew->offset = block;
+ recurseadf (znnew, block, name2);
+ }
if (!adf_read_block (adf, block))
return;
}
zai.size = glx (p + 16);
}
znnew = zvolume_addfile_abs (zv, &zai);
- znnew->offset = block;
- znnew->offset2 = p - adf->block;
+ if (znnew) {
+ znnew->offset = block;
+ znnew->offset2 = p - adf->block;
+ }
}
xfree (zai.comment);
xfree (fname);
zai.size = size;
zai.flags = -1;
zn = zvolume_addfile_abs (zv, &zai);
- zn->offset = partblock;
- zn->offset2 = blocksize; // abuse of offset2..
+ if (zn) {
+ zn->offset = partblock;
+ zn->offset2 = blocksize; // abuse of offset2..
+ }
}
zfile_fseek (z, 0, SEEK_SET);
} else {
zai.size = size;
znnew = zvolume_addfile_abs (zv, &zai);
- znnew->offset = startcluster;
+ if (znnew) {
+ znnew->offset = startcluster;
+ }
}
xfree (fname);