Blame SOURCES/0002-kwaj_read_headers-fix-handling-of-non-terminated-str.patch

f908bb
From 727255122e4e574525275b9c8047462b25e5ccc5 Mon Sep 17 00:00:00 2001
f908bb
From: Stuart Caie <kyzer@cabextract.org.uk>
f908bb
Date: Sun, 26 Nov 2017 14:28:54 +0000
f908bb
Subject: [PATCH 2/3] kwaj_read_headers(): fix handling of non-terminated
f908bb
 strings
f908bb
f908bb
(cherry picked from commit 0b0ef9344255ff5acfac6b7af09198ac9c9756c8)
f908bb
---
f908bb
 libmspack/trunk/Makefile.am                   |   4 +-
f908bb
 libmspack/trunk/mspack/kwajd.c                |  32 +++--
f908bb
 libmspack/trunk/test/kwajd_test.c             | 116 ++++++++++++++++++
f908bb
 libmspack/trunk/test/test_files/kwajd/f00.kwj | Bin 0 -> 15 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f01.kwj | Bin 0 -> 17 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f02.kwj | Bin 0 -> 18 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f03.kwj | Bin 0 -> 19 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f04.kwj | Bin 0 -> 19 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f10.kwj | Bin 0 -> 17 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f11.kwj | Bin 0 -> 19 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f12.kwj | Bin 0 -> 20 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f13.kwj | Bin 0 -> 21 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f14.kwj | Bin 0 -> 21 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f20.kwj | Bin 0 -> 18 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f21.kwj | Bin 0 -> 20 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f22.kwj | Bin 0 -> 21 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f23.kwj | Bin 0 -> 22 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f24.kwj | Bin 0 -> 22 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f30.kwj | Bin 0 -> 19 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f31.kwj | Bin 0 -> 21 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f32.kwj | Bin 0 -> 22 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f33.kwj | Bin 0 -> 23 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f34.kwj | Bin 0 -> 23 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f40.kwj | Bin 0 -> 20 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f41.kwj | Bin 0 -> 22 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f42.kwj | Bin 0 -> 23 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f43.kwj | Bin 0 -> 24 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f44.kwj | Bin 0 -> 24 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f50.kwj | Bin 0 -> 21 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f51.kwj | Bin 0 -> 23 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f52.kwj | Bin 0 -> 24 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f53.kwj | Bin 0 -> 25 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f54.kwj | Bin 0 -> 25 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f60.kwj | Bin 0 -> 22 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f61.kwj | Bin 0 -> 24 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f62.kwj | Bin 0 -> 25 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f63.kwj | Bin 0 -> 26 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f64.kwj | Bin 0 -> 26 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f70.kwj | Bin 0 -> 23 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f71.kwj | Bin 0 -> 25 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f72.kwj | Bin 0 -> 26 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f73.kwj | Bin 0 -> 27 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f74.kwj | Bin 0 -> 27 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f80.kwj | Bin 0 -> 24 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f81.kwj | Bin 0 -> 26 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f82.kwj | Bin 0 -> 27 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f83.kwj | Bin 0 -> 28 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f84.kwj | Bin 0 -> 28 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f90.kwj | Bin 0 -> 24 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f91.kwj | Bin 0 -> 26 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f92.kwj | Bin 0 -> 27 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f93.kwj | Bin 0 -> 28 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/f94.kwj | Bin 0 -> 28 bytes
f908bb
 libmspack/trunk/test/test_files/kwajd/make.pl |  17 +++
f908bb
 54 files changed, 155 insertions(+), 14 deletions(-)
f908bb
 create mode 100644 libmspack/trunk/test/kwajd_test.c
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f00.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f01.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f02.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f03.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f04.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f10.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f11.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f12.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f13.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f14.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f20.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f21.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f22.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f23.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f24.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f30.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f31.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f32.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f33.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f34.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f40.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f41.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f42.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f43.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f44.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f50.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f51.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f52.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f53.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f54.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f60.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f61.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f62.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f63.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f64.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f70.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f71.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f72.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f73.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f74.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f80.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f81.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f82.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f83.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f84.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f90.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f91.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f92.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f93.kwj
f908bb
 create mode 100644 libmspack/trunk/test/test_files/kwajd/f94.kwj
f908bb
 create mode 100755 libmspack/trunk/test/test_files/kwajd/make.pl
f908bb
f908bb
diff --git a/libmspack/trunk/Makefile.am b/libmspack/trunk/Makefile.am
f908bb
index 4c295a5..ea48f03 100644
f908bb
--- a/libmspack/trunk/Makefile.am
f908bb
+++ b/libmspack/trunk/Makefile.am
f908bb
@@ -23,7 +23,7 @@ noinst_LTLIBRARIES =	libmscabd.la libmschmd.la
f908bb
 noinst_PROGRAMS =	test/cabd_md5 test/cabd_memory test/cabd_test \
f908bb
 			test/cabrip test/chmd_md5 test/chmx test/chminfo \
f908bb
 			test/multifh test/expand test/chmd_find \
f908bb
-			test/chmd_order test/oabx
f908bb
+			test/chmd_order test/oabx test/kwajd_test
f908bb
 
f908bb
 libmspack_la_SOURCES =	mspack/mspack.h \
f908bb
 			mspack/system.h mspack/system.c \
f908bb
@@ -98,3 +98,5 @@ test_chmd_order_LDADD = libmschmd.la
f908bb
 test_oabx_SOURCES =	test/oabx.c test/md5.c test/md5.h test/md5_fh.h \
f908bb
 			test/error.h libmspack.la
f908bb
 test_oabx_LDADD =	libmspack.la
f908bb
+test_kwajd_test_SOURCES =	test/kwajd_test.c libmspack.la
f908bb
+test_kwajd_test_LDADD = 	libmspack.la
f908bb
diff --git a/libmspack/trunk/mspack/kwajd.c b/libmspack/trunk/mspack/kwajd.c
f908bb
index c9e006c..50be257 100644
f908bb
--- a/libmspack/trunk/mspack/kwajd.c
f908bb
+++ b/libmspack/trunk/mspack/kwajd.c
f908bb
@@ -198,30 +198,36 @@ static int kwajd_read_headers(struct mspack_system *sys,
f908bb
 
f908bb
     /* filename and extension */
f908bb
     if (hdr->headers & (MSKWAJ_HDR_HASFILENAME | MSKWAJ_HDR_HASFILEEXT)) {
f908bb
-	off_t pos = sys->tell(fh);
f908bb
-	char *fn = (char *) sys->alloc(sys, (size_t) 13);
f908bb
-
f908bb
+	int len;
f908bb
 	/* allocate memory for maximum length filename */
f908bb
-	if (! fn) return MSPACK_ERR_NOMEMORY;
f908bb
-	hdr->filename = fn;
f908bb
+	char *fn = (char *) sys->alloc(sys, (size_t) 13);
f908bb
+	if (!(hdr->filename = fn)) return MSPACK_ERR_NOMEMORY;
f908bb
 
f908bb
 	/* copy filename if present */
f908bb
 	if (hdr->headers & MSKWAJ_HDR_HASFILENAME) {
f908bb
-	    if (sys->read(fh, &buf[0], 9) != 9) return MSPACK_ERR_READ;
f908bb
-	    for (i = 0; i < 9; i++, fn++) if (!(*fn = buf[i])) break;
f908bb
-	    pos += (i < 9) ? i+1 : 9;
f908bb
-	    if (sys->seek(fh, pos, MSPACK_SYS_SEEK_START))
f908bb
+	    /* read and copy up to 9 bytes of a null terminated string */
f908bb
+	    if ((len = sys->read(fh, &buf[0], 9)) < 2) return MSPACK_ERR_READ;
f908bb
+	    for (i = 0; i < len; i++) if (!(*fn++ = buf[i])) break;
f908bb
+	    /* if string was 9 bytes with no null terminator, reject it */
f908bb
+	    if (i == 9 && buf[8] != '\0') return MSPACK_ERR_DATAFORMAT;
f908bb
+	    /* seek to byte after string ended in file */
f908bb
+	    if (sys->seek(fh, (off_t)(i + 1 - len), MSPACK_SYS_SEEK_CUR))
f908bb
 		return MSPACK_ERR_SEEK;
f908bb
+	    fn--; /* remove the null terminator */
f908bb
 	}
f908bb
 
f908bb
 	/* copy extension if present */
f908bb
 	if (hdr->headers & MSKWAJ_HDR_HASFILEEXT) {
f908bb
 	    *fn++ = '.';
f908bb
-	    if (sys->read(fh, &buf[0], 4) != 4) return MSPACK_ERR_READ;
f908bb
-	    for (i = 0; i < 4; i++, fn++) if (!(*fn = buf[i])) break;
f908bb
-	    pos += (i < 4) ? i+1 : 4;
f908bb
-	    if (sys->seek(fh, pos, MSPACK_SYS_SEEK_START))
f908bb
+	    /* read and copy up to 4 bytes of a null terminated string */
f908bb
+	    if ((len = sys->read(fh, &buf[0], 4)) < 2) return MSPACK_ERR_READ;
f908bb
+	    for (i = 0; i < len; i++) if (!(*fn++ = buf[i])) break;
f908bb
+	    /* if string was 4 bytes with no null terminator, reject it */
f908bb
+	    if (i == 4 && buf[3] != '\0') return MSPACK_ERR_DATAFORMAT;
f908bb
+	    /* seek to byte after string ended in file */
f908bb
+	    if (sys->seek(fh, (off_t)(i + 1 - len), MSPACK_SYS_SEEK_CUR))
f908bb
 		return MSPACK_ERR_SEEK;
f908bb
+	    fn--; /* remove the null terminator */
f908bb
 	}
f908bb
 	*fn = '\0';
f908bb
     }
f908bb
diff --git a/libmspack/trunk/test/kwajd_test.c b/libmspack/trunk/test/kwajd_test.c
f908bb
new file mode 100644
f908bb
index 0000000..4ee10f9
f908bb
--- /dev/null
f908bb
+++ b/libmspack/trunk/test/kwajd_test.c
f908bb
@@ -0,0 +1,116 @@
f908bb
+/* KWAJ regression test suite */
f908bb
+
f908bb
+#ifdef HAVE_CONFIG_H
f908bb
+#include <config.h>
f908bb
+#endif
f908bb
+
f908bb
+#include <stdio.h>
f908bb
+#include <stdlib.h>
f908bb
+#include <string.h>
f908bb
+#include <mspack.h>
f908bb
+
f908bb
+unsigned int test_count = 0;
f908bb
+#define TEST(x) do {\
f908bb
+    test_count++; \
f908bb
+    if (!(x)) {printf("%s:%d FAILED %s\n",__FUNCTION__,__LINE__,#x);exit(1);} \
f908bb
+} while (0)
f908bb
+
f908bb
+/* test parsing of KWAJ filename/extension headers */
f908bb
+void kwajd_open_test_01() {
f908bb
+    struct mskwaj_decompressor *kwajd;
f908bb
+    struct mskwajd_header *hdr;
f908bb
+
f908bb
+    kwajd = mspack_create_kwaj_decompressor(NULL);
f908bb
+    TEST(kwajd != NULL);
f908bb
+
f908bb
+    hdr = kwajd->open(kwajd, "test_files/kwajd/f00.kwj");
f908bb
+    TEST(hdr != NULL);
f908bb
+    TEST(hdr->filename == NULL);
f908bb
+    kwajd->close(kwajd, hdr);
f908bb
+
f908bb
+#define TEST_FNAME(testfile, fname)      \
f908bb
+    hdr = kwajd->open(kwajd, testfile);  \
f908bb
+    TEST(hdr != NULL);                   \
f908bb
+    TEST(hdr->filename != NULL);         \
f908bb
+    TEST(!strcmp(fname, hdr->filename)); \
f908bb
+    kwajd->close(kwajd, hdr)
f908bb
+#define TEST_FNAME_BAD(testfile)         \
f908bb
+    hdr = kwajd->open(kwajd, testfile);  \
f908bb
+    TEST(hdr == NULL);                   \
f908bb
+    TEST(kwajd->last_error(kwajd) == MSPACK_ERR_DATAFORMAT)
f908bb
+
f908bb
+    TEST_FNAME("test_files/kwajd/f01.kwj", ".1");
f908bb
+    TEST_FNAME("test_files/kwajd/f02.kwj", ".12");
f908bb
+    TEST_FNAME("test_files/kwajd/f03.kwj", ".123");
f908bb
+
f908bb
+    TEST_FNAME("test_files/kwajd/f10.kwj", "1");
f908bb
+    TEST_FNAME("test_files/kwajd/f11.kwj", "1.1");
f908bb
+    TEST_FNAME("test_files/kwajd/f12.kwj", "1.12");
f908bb
+    TEST_FNAME("test_files/kwajd/f13.kwj", "1.123");
f908bb
+
f908bb
+    TEST_FNAME("test_files/kwajd/f20.kwj", "12");
f908bb
+    TEST_FNAME("test_files/kwajd/f21.kwj", "12.1");
f908bb
+    TEST_FNAME("test_files/kwajd/f22.kwj", "12.12");
f908bb
+    TEST_FNAME("test_files/kwajd/f23.kwj", "12.123");
f908bb
+
f908bb
+    TEST_FNAME("test_files/kwajd/f30.kwj", "123");
f908bb
+    TEST_FNAME("test_files/kwajd/f31.kwj", "123.1");
f908bb
+    TEST_FNAME("test_files/kwajd/f32.kwj", "123.12");
f908bb
+    TEST_FNAME("test_files/kwajd/f33.kwj", "123.123");
f908bb
+
f908bb
+    TEST_FNAME("test_files/kwajd/f40.kwj", "1234");
f908bb
+    TEST_FNAME("test_files/kwajd/f41.kwj", "1234.1");
f908bb
+    TEST_FNAME("test_files/kwajd/f42.kwj", "1234.12");
f908bb
+    TEST_FNAME("test_files/kwajd/f43.kwj", "1234.123");
f908bb
+
f908bb
+    TEST_FNAME("test_files/kwajd/f50.kwj", "12345");
f908bb
+    TEST_FNAME("test_files/kwajd/f51.kwj", "12345.1");
f908bb
+    TEST_FNAME("test_files/kwajd/f52.kwj", "12345.12");
f908bb
+    TEST_FNAME("test_files/kwajd/f53.kwj", "12345.123");
f908bb
+
f908bb
+    TEST_FNAME("test_files/kwajd/f60.kwj", "123456");
f908bb
+    TEST_FNAME("test_files/kwajd/f61.kwj", "123456.1");
f908bb
+    TEST_FNAME("test_files/kwajd/f62.kwj", "123456.12");
f908bb
+    TEST_FNAME("test_files/kwajd/f63.kwj", "123456.123");
f908bb
+
f908bb
+    TEST_FNAME("test_files/kwajd/f70.kwj", "1234567");
f908bb
+    TEST_FNAME("test_files/kwajd/f71.kwj", "1234567.1");
f908bb
+    TEST_FNAME("test_files/kwajd/f72.kwj", "1234567.12");
f908bb
+    TEST_FNAME("test_files/kwajd/f73.kwj", "1234567.123");
f908bb
+
f908bb
+    TEST_FNAME("test_files/kwajd/f80.kwj", "12345678");
f908bb
+    TEST_FNAME("test_files/kwajd/f81.kwj", "12345678.1");
f908bb
+    TEST_FNAME("test_files/kwajd/f82.kwj", "12345678.12");
f908bb
+    TEST_FNAME("test_files/kwajd/f83.kwj", "12345678.123");
f908bb
+
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f04.kwj");
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f14.kwj");
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f24.kwj");
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f34.kwj");
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f44.kwj");
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f54.kwj");
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f64.kwj");
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f74.kwj");
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f84.kwj");
f908bb
+
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f90.kwj");
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f91.kwj");
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f92.kwj");
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f93.kwj");
f908bb
+    TEST_FNAME_BAD("test_files/kwajd/f94.kwj");
f908bb
+
f908bb
+
f908bb
+    mspack_destroy_kwaj_decompressor(kwajd);
f908bb
+}
f908bb
+
f908bb
+int main() {
f908bb
+  int selftest;
f908bb
+
f908bb
+  MSPACK_SYS_SELFTEST(selftest);
f908bb
+  TEST(selftest == MSPACK_ERR_OK);
f908bb
+
f908bb
+  kwajd_open_test_01();
f908bb
+
f908bb
+  printf("ALL %d TESTS PASSED.\n", test_count);
f908bb
+  return 0;
f908bb
+}
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f00.kwj b/libmspack/trunk/test/test_files/kwajd/f00.kwj
f908bb
new file mode 100644
f908bb
index 0000000..1aa817e
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f00.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f01.kwj b/libmspack/trunk/test/test_files/kwajd/f01.kwj
f908bb
new file mode 100644
f908bb
index 0000000..9fbedda
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f01.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f02.kwj b/libmspack/trunk/test/test_files/kwajd/f02.kwj
f908bb
new file mode 100644
f908bb
index 0000000..a81a863
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f02.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f03.kwj b/libmspack/trunk/test/test_files/kwajd/f03.kwj
f908bb
new file mode 100644
f908bb
index 0000000..52bfb1e
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f03.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f04.kwj b/libmspack/trunk/test/test_files/kwajd/f04.kwj
f908bb
new file mode 100644
f908bb
index 0000000..1775433
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f04.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f10.kwj b/libmspack/trunk/test/test_files/kwajd/f10.kwj
f908bb
new file mode 100644
f908bb
index 0000000..40f944b
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f10.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f11.kwj b/libmspack/trunk/test/test_files/kwajd/f11.kwj
f908bb
new file mode 100644
f908bb
index 0000000..eca53c9
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f11.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f12.kwj b/libmspack/trunk/test/test_files/kwajd/f12.kwj
f908bb
new file mode 100644
f908bb
index 0000000..767c355
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f12.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f13.kwj b/libmspack/trunk/test/test_files/kwajd/f13.kwj
f908bb
new file mode 100644
f908bb
index 0000000..f8d7fb6
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f13.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f14.kwj b/libmspack/trunk/test/test_files/kwajd/f14.kwj
f908bb
new file mode 100644
f908bb
index 0000000..486e580
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f14.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f20.kwj b/libmspack/trunk/test/test_files/kwajd/f20.kwj
f908bb
new file mode 100644
f908bb
index 0000000..89de0ef
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f20.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f21.kwj b/libmspack/trunk/test/test_files/kwajd/f21.kwj
f908bb
new file mode 100644
f908bb
index 0000000..a4c3a8c
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f21.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f22.kwj b/libmspack/trunk/test/test_files/kwajd/f22.kwj
f908bb
new file mode 100644
f908bb
index 0000000..fa9c35d
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f22.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f23.kwj b/libmspack/trunk/test/test_files/kwajd/f23.kwj
f908bb
new file mode 100644
f908bb
index 0000000..c10cc71
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f23.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f24.kwj b/libmspack/trunk/test/test_files/kwajd/f24.kwj
f908bb
new file mode 100644
f908bb
index 0000000..75858e7
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f24.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f30.kwj b/libmspack/trunk/test/test_files/kwajd/f30.kwj
f908bb
new file mode 100644
f908bb
index 0000000..e2b452e
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f30.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f31.kwj b/libmspack/trunk/test/test_files/kwajd/f31.kwj
f908bb
new file mode 100644
f908bb
index 0000000..05e0ce1
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f31.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f32.kwj b/libmspack/trunk/test/test_files/kwajd/f32.kwj
f908bb
new file mode 100644
f908bb
index 0000000..96a5739
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f32.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f33.kwj b/libmspack/trunk/test/test_files/kwajd/f33.kwj
f908bb
new file mode 100644
f908bb
index 0000000..935d6df
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f33.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f34.kwj b/libmspack/trunk/test/test_files/kwajd/f34.kwj
f908bb
new file mode 100644
f908bb
index 0000000..d7084c5
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f34.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f40.kwj b/libmspack/trunk/test/test_files/kwajd/f40.kwj
f908bb
new file mode 100644
f908bb
index 0000000..64cfc84
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f40.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f41.kwj b/libmspack/trunk/test/test_files/kwajd/f41.kwj
f908bb
new file mode 100644
f908bb
index 0000000..657177a
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f41.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f42.kwj b/libmspack/trunk/test/test_files/kwajd/f42.kwj
f908bb
new file mode 100644
f908bb
index 0000000..6ff2b22
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f42.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f43.kwj b/libmspack/trunk/test/test_files/kwajd/f43.kwj
f908bb
new file mode 100644
f908bb
index 0000000..52c6c10
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f43.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f44.kwj b/libmspack/trunk/test/test_files/kwajd/f44.kwj
f908bb
new file mode 100644
f908bb
index 0000000..bc4d510
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f44.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f50.kwj b/libmspack/trunk/test/test_files/kwajd/f50.kwj
f908bb
new file mode 100644
f908bb
index 0000000..31bf367
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f50.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f51.kwj b/libmspack/trunk/test/test_files/kwajd/f51.kwj
f908bb
new file mode 100644
f908bb
index 0000000..c63c061
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f51.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f52.kwj b/libmspack/trunk/test/test_files/kwajd/f52.kwj
f908bb
new file mode 100644
f908bb
index 0000000..9ab9716
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f52.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f53.kwj b/libmspack/trunk/test/test_files/kwajd/f53.kwj
f908bb
new file mode 100644
f908bb
index 0000000..e973626
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f53.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f54.kwj b/libmspack/trunk/test/test_files/kwajd/f54.kwj
f908bb
new file mode 100644
f908bb
index 0000000..f3b2887
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f54.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f60.kwj b/libmspack/trunk/test/test_files/kwajd/f60.kwj
f908bb
new file mode 100644
f908bb
index 0000000..af39e58
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f60.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f61.kwj b/libmspack/trunk/test/test_files/kwajd/f61.kwj
f908bb
new file mode 100644
f908bb
index 0000000..a8d6278
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f61.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f62.kwj b/libmspack/trunk/test/test_files/kwajd/f62.kwj
f908bb
new file mode 100644
f908bb
index 0000000..225f8df
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f62.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f63.kwj b/libmspack/trunk/test/test_files/kwajd/f63.kwj
f908bb
new file mode 100644
f908bb
index 0000000..50f7980
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f63.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f64.kwj b/libmspack/trunk/test/test_files/kwajd/f64.kwj
f908bb
new file mode 100644
f908bb
index 0000000..84c2679
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f64.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f70.kwj b/libmspack/trunk/test/test_files/kwajd/f70.kwj
f908bb
new file mode 100644
f908bb
index 0000000..3507550
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f70.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f71.kwj b/libmspack/trunk/test/test_files/kwajd/f71.kwj
f908bb
new file mode 100644
f908bb
index 0000000..92c2141
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f71.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f72.kwj b/libmspack/trunk/test/test_files/kwajd/f72.kwj
f908bb
new file mode 100644
f908bb
index 0000000..a2e57ab
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f72.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f73.kwj b/libmspack/trunk/test/test_files/kwajd/f73.kwj
f908bb
new file mode 100644
f908bb
index 0000000..77b1cad
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f73.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f74.kwj b/libmspack/trunk/test/test_files/kwajd/f74.kwj
f908bb
new file mode 100644
f908bb
index 0000000..a760b8e
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f74.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f80.kwj b/libmspack/trunk/test/test_files/kwajd/f80.kwj
f908bb
new file mode 100644
f908bb
index 0000000..b2e106f
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f80.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f81.kwj b/libmspack/trunk/test/test_files/kwajd/f81.kwj
f908bb
new file mode 100644
f908bb
index 0000000..6f5bddd
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f81.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f82.kwj b/libmspack/trunk/test/test_files/kwajd/f82.kwj
f908bb
new file mode 100644
f908bb
index 0000000..eea7493
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f82.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f83.kwj b/libmspack/trunk/test/test_files/kwajd/f83.kwj
f908bb
new file mode 100644
f908bb
index 0000000..161a940
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f83.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f84.kwj b/libmspack/trunk/test/test_files/kwajd/f84.kwj
f908bb
new file mode 100644
f908bb
index 0000000..d0e0233
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f84.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f90.kwj b/libmspack/trunk/test/test_files/kwajd/f90.kwj
f908bb
new file mode 100644
f908bb
index 0000000..8605aca
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f90.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f91.kwj b/libmspack/trunk/test/test_files/kwajd/f91.kwj
f908bb
new file mode 100644
f908bb
index 0000000..2fadfc7
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f91.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f92.kwj b/libmspack/trunk/test/test_files/kwajd/f92.kwj
f908bb
new file mode 100644
f908bb
index 0000000..c8a99ae
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f92.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f93.kwj b/libmspack/trunk/test/test_files/kwajd/f93.kwj
f908bb
new file mode 100644
f908bb
index 0000000..559faa9
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f93.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/f94.kwj b/libmspack/trunk/test/test_files/kwajd/f94.kwj
f908bb
new file mode 100644
f908bb
index 0000000..c52dfeb
f908bb
Binary files /dev/null and b/libmspack/trunk/test/test_files/kwajd/f94.kwj differ
f908bb
diff --git a/libmspack/trunk/test/test_files/kwajd/make.pl b/libmspack/trunk/test/test_files/kwajd/make.pl
f908bb
new file mode 100755
f908bb
index 0000000..ae73038
f908bb
--- /dev/null
f908bb
+++ b/libmspack/trunk/test/test_files/kwajd/make.pl
f908bb
@@ -0,0 +1,17 @@
f908bb
+#!/usr/bin/perl -w
f908bb
+use strict;
f908bb
+my $name = '123456789';
f908bb
+for my $file (0 .. 9) {
f908bb
+    for my $ext (0 .. 4) {
f908bb
+	open my $fh, '>', "f$file$ext.kwj";
f908bb
+        my $offset = 14  + $file + $ext;
f908bb
+	my $flags  = ($file > 0 ? 8 : 0) | ($ext > 0 ? 16 : 0);
f908bb
+	print $fh pack 'A4Vvvv', 'KWAJ', 0xD127F088, 0, $offset, $flags;
f908bb
+	print $fh substr $name, 0, $file if $file > 0;
f908bb
+	print $fh "\0" if $file > 0 && $file < 9;
f908bb
+	print $fh substr $name, 0, $ext if $ext > 0;
f908bb
+	print $fh "\0" if $ext > 0 && $ext < 4;
f908bb
+        print $fh "\xFF";
f908bb
+	close $fh;
f908bb
+    }
f908bb
+}
f908bb
-- 
f908bb
2.18.0
f908bb