A binary header is 12 bytes + (4 bytes * Number of Arguments) bigger than the actual binary. Before this commit image extraction was wrong an made binary.0 too big by four bytes at the end (which were 0 in all usual cases). Image creation had the same problem which resulted in broken images when the binary doesn't end in 4 bytes containing 0. Further handle binaries with a length that is not aligned to 4 bytes. Note this is an incompatible change in the sense that a binary.0 that is extracted with the new code cannot be used by the old code. The other way around works however unless the image does very strange things. If you find this commit during bisection, try appending 4 zero bytes to your binary.0. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> --- scripts/kwbimage.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/kwbimage.c b/scripts/kwbimage.c index 57f563ece651..5b84db3f7a23 100644 --- a/scripts/kwbimage.c +++ b/scripts/kwbimage.c @@ -491,7 +491,7 @@ static int image_extract_binary_hdr_v1(const void *binary, const char *output, } ret = fwrite(binary + (nargs + 1) * sizeof(unsigned int), - binsz - (nargs + 1) * sizeof(unsigned int), 1, + binsz - (nargs + 2) * sizeof(unsigned int), 1, binaryout); if (ret != 1) { fprintf(stderr, "Could not write to output file %s\n", @@ -870,8 +870,8 @@ static void *image_create_v1(struct image_cfg_element *image_cfg, return NULL; } - headersz += s.st_size + - binarye->binary.nargs * sizeof(unsigned int); + headersz += ALIGN_SUP(s.st_size, 4) + + 12 + binarye->binary.nargs * sizeof(unsigned int); hasext = 1; } @@ -952,8 +952,8 @@ static void *image_create_v1(struct image_cfg_element *image_cfg, fstat(fileno(bin), &s); binhdrsz = sizeof(struct opt_hdr_v1) + - (binarye->binary.nargs + 1) * sizeof(unsigned int) + - s.st_size; + (binarye->binary.nargs + 2) * sizeof(unsigned int) + + ALIGN_SUP(s.st_size, 4); hdr->headersz_lsb = binhdrsz & 0xFFFF; hdr->headersz_msb = (binhdrsz & 0xFFFF0000) >> 16; @@ -977,7 +977,7 @@ static void *image_create_v1(struct image_cfg_element *image_cfg, fclose(bin); - cur += s.st_size; + cur += ALIGN_SUP(s.st_size, 4); /* * For now, we don't support more than one binary -- 2.10.2 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox