Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[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>
  • Loading branch information
stefanha authored and Michael Brown committed Apr 26, 2009
1 parent 4b8e021 commit 9b964de
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions src/util/zbin.c
Expand Up @@ -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;

Expand All @@ -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: {
Expand Down

0 comments on commit 9b964de

Please sign in to comment.