From 9b964dec363b12f5f18057d740d96e887cf58186 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Fri, 24 Apr 2009 10:21:07 +0100 Subject: [PATCH] [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 Signed-off-by: Michael Brown --- src/util/zbin.c | 9 +++++---- 1 file 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: {