summaryrefslogtreecommitdiffstats
path: root/src/util
diff options
context:
space:
mode:
authorStefan Hajnoczi2009-04-24 11:21:07 +0200
committerMichael Brown2009-04-26 06:48:15 +0200
commit9b964dec363b12f5f18057d740d96e887cf58186 (patch)
treedfb7fc6afec711a9cdd58089929dc1f1f61ff07e /src/util
parent[elf] Work around entry point bug in NetBSD kernels (diff)
downloadipxe-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')
-rw-r--r--src/util/zbin.c9
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: {