diff options
author | Stefan Hajnoczi | 2009-04-24 11:21:07 +0200 |
---|---|---|
committer | Michael Brown | 2009-04-26 06:48:15 +0200 |
commit | 9b964dec363b12f5f18057d740d96e887cf58186 (patch) | |
tree | dfb7fc6afec711a9cdd58089929dc1f1f61ff07e /src/util/zbin.c | |
parent | [elf] Work around entry point bug in NetBSD kernels (diff) | |
download | ipxe-9b964dec363b12f5f18057d740d96e887cf58186.tar.gz ipxe-9b964dec363b12f5f18057d740d96e887cf58186.tar.xz ipxe-9b964dec363b12f5f18057d740d96e887cf58186.zip |
[build] Fix signed/unsigned division in util/zbin.c
Commit b149a99 ([build] Round up SUBx deltas) introduced a
signed/unsigned issue that affects gPXE images built on 32-bit hosts.
The zbin fixup utility performed an unsigned division, which led to
.usb images with an incorrect number of sectors to load.
The issue snuck by on 64-bit hosts since uint32_t is promoted to long.
On 32-bit hosts it is promoted to unsigned long.
Modified-by: Michael Brown <mcb30@etherboot.org>
Signed-off-by: Michael Brown <mcb30@etherboot.org>
Diffstat (limited to 'src/util/zbin.c')
-rw-r--r-- | src/util/zbin.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/util/zbin.c b/src/util/zbin.c index d4eebe57..1513289e 100644 --- a/src/util/zbin.c +++ b/src/util/zbin.c @@ -213,7 +213,8 @@ static int process_zinfo_subtract ( struct input_file *input, size_t datasize ) { size_t offset = subtract->offset; void *target; - long delta; + signed long raw_delta; + signed long delta; unsigned long old; unsigned long new; @@ -224,9 +225,9 @@ static int process_zinfo_subtract ( struct input_file *input, } target = ( output->buf + offset ); - delta = ( ( align ( output->len, subtract->divisor ) - - align ( input->len, subtract->divisor ) ) - / subtract->divisor ); + raw_delta = ( align ( output->len, subtract->divisor ) - + align ( input->len, subtract->divisor ) ); + delta = ( raw_delta / ( ( signed long ) subtract->divisor ) ); switch ( datasize ) { case 1: { |