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>
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;
}
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: {