Browse Source

[zbin] Fix check for existence of most recent output byte

The code in lzma_literal() checks to see if we are at the start of the
compressed input data in order to determine whether or not a most
recent output byte exists.  This check is incorrect, since
initialisation of the decompressor will always consume the first five
bytes of the compressed input data.

Fix by instead checking whether or not we are at the start of the
output data stream.  This is, in any case, a more logical check.

This issue was masked during development and testing since virtual
machines tend to zero the initial contents of RAM; the spuriously-read
"most recent output byte" is therefore likely to already be a zero
when running in a virtual machine.

Reported-by: Robin Smidsrød <robin@smidsrod.no>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 9 years ago
parent
commit
ea3be0f4a6
1 changed files with 1 additions and 3 deletions
  1. 1
    3
      src/arch/i386/prefix/unlzma.S

+ 1
- 3
src/arch/i386/prefix/unlzma.S View File

@@ -194,7 +194,6 @@ high:		.rept	( 1 << 8 )
194 194
 
195 195
 	.struct	0
196 196
 lzma_dec:
197
-in_start:	.long	0
198 197
 out_start:	.long	0
199 198
 rc_code:	.long	0
200 199
 rc_range:	.long	0
@@ -487,7 +486,7 @@ rc_direct:
487 486
 lzma_literal:
488 487
 	/* Get most recent output byte, if available */
489 488
 	xorl	%ebx, %ebx
490
-	cmpl	%esi, in_start(%ebp)
489
+	cmpl	%edi, out_start(%ebp)
491 490
 	je	1f
492 491
 	movb	%es:-1(%edi), %bh
493 492
 1:	/* Locate probability estimate set */
@@ -901,7 +900,6 @@ decompress:
901 900
 	popw	%es
902 901
 	popl	%edi
903 902
 	/* Initialise remaining parameters */
904
-	movl	%esi, in_start(%ebp)
905 903
 	movl	%edi, out_start(%ebp)
906 904
 	print_character $('\n')
907 905
 	ADDR32 lodsb	/* discard initial byte */

Loading…
Cancel
Save