wok rev 18801

syslinux: auto unlzma needs size to work
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Jan 11 17:54:50 2016 +0100 (2016-01-11)
parents ad074da5360c
children 429407501864
files syslinux/stuff/extra/loadhigh.u
line diff
     1.1 --- a/syslinux/stuff/extra/loadhigh.u	Sun Jan 10 21:57:16 2016 +0100
     1.2 +++ b/syslinux/stuff/extra/loadhigh.u	Mon Jan 11 17:54:50 2016 +0100
     1.3 @@ -12,34 +12,33 @@
     1.4   
     1.5   #define MAX_CHUNK	(1 << 20) /* 1 MB */
     1.6   
     1.7 -@@ -51,6 +56,10 @@
     1.8 +@@ -51,6 +56,9 @@
     1.9       uint32_t sector_mask;
    1.10       size_t pad;
    1.11       uint32_t retflags = 0;
    1.12  +#ifdef LZLOAD
    1.13  +    char *unpacked = (char *) regs->edi.l;
    1.14 -+    size_t unpackedsz;
    1.15  +#endif
    1.16   
    1.17       bytes     = regs->eax.l;
    1.18       zero_mask = regs->edx.w[0];
    1.19 -@@ -101,6 +110,27 @@
    1.20 +@@ -101,6 +109,27 @@
    1.21   	    break;
    1.22   	}
    1.23       }
    1.24  +
    1.25  +#ifdef LZLOAD
    1.26 -+    unpackedsz = buf - unpacked;
    1.27  +    switch (* (short *) unpacked) {
    1.28  +	char *packed;
    1.29 ++	size_t packedsz, unpackedsz;
    1.30  +    case 0x005D:
    1.31 -+	packed = unpacked + * (unsigned long *) (unpacked + 5)
    1.32 -+			- unpackedsz + 1024;
    1.33 -+
    1.34 -+	if (packed < unpacked + 1024)
    1.35 -+		packed = unpacked + 1024;
    1.36 -+	memmove(packed, unpacked, unpackedsz);
    1.37 -+	unlzma(packed, unpacked, packed + unpackedsz /* head */);
    1.38 ++  	packedsz = buf - unpacked;
    1.39 ++	unpackedsz = * (unsigned long *) (unpacked + 5);
    1.40 ++	if (unpackedsz > 1000000) break; /* no size? */
    1.41 ++	packed = unpacked + unpackedsz - packedsz + 1024;
    1.42 ++	if (packed < unpacked + 1024) packed = unpacked + 1024;
    1.43 ++	memmove(packed, unpacked, packedsz);
    1.44 ++	unlzma(packed, unpacked, packed + packedsz /* heap */);
    1.45  +	buf = packed;
    1.46  +	break;
    1.47  +    case 0x2204: