X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/3d975fbf42320b3c8ed9e982fdbe54d18447da04..147800af355a7388117e168572489b3e64c51a33:/tools/firmware-utils/src/imagetag.c diff --git a/tools/firmware-utils/src/imagetag.c b/tools/firmware-utils/src/imagetag.c index 4d5bb7d4e..e93f5f45e 100644 --- a/tools/firmware-utils/src/imagetag.c +++ b/tools/firmware-utils/src/imagetag.c @@ -135,11 +135,12 @@ int tagfile(const char *kernel, const char *rootfs, const char *bin, union bcm_tag tag; struct kernelhdr khdr; FILE *kernelfile = NULL, *rootfsfile = NULL, *binfile; - size_t kerneloff, kernellen, rootfsoff, rootfslen, read, imagelen, rootfsoffpadlen; + size_t kerneloff, kernellen, rootfsoff, rootfslen, read, imagelen, rootfsoffpadlen, kernelfslen; uint8_t readbuf[1024]; uint32_t imagecrc = IMAGETAG_CRC_START; uint32_t kernelcrc = IMAGETAG_CRC_START; uint32_t rootfscrc = IMAGETAG_CRC_START; + uint32_t kernelfscrc = IMAGETAG_CRC_START; const uint32_t deadcode = htonl(DEADCODE); union int2char intchar; @@ -218,6 +219,10 @@ int tagfile(const char *kernel, const char *rootfs, const char *bin, fseek(binfile, rootfsoff + rootfslen - fwaddr, SEEK_SET); fwrite(&deadcode, sizeof(uint32_t), 1, binfile); + /* Flush the binfile buffer so that when we read from file, it contains + * everything in the buffer + */ + fflush(binfile); /* Choose and compute the CRC32 that should be inserted in the tag */ if ( tagid && ( (strncmp(tagid, "bccfe", TAGID_LEN) == 0)) || ( strncmp(tagid, "bc300", TAGID_LEN) == 0)) { @@ -230,7 +235,7 @@ int tagfile(const char *kernel, const char *rootfs, const char *bin, /* Compute the crc32 of the entire image (deadC0de included) */ imagecrc = compute_crc32(imagecrc, binfile, kerneloff - fwaddr, imagelen); /* Compute the crc32 of the kernel and padding between kernel and rootfs) */ - kernelcrc = compute_crc32(kernelcrc, binfile, kerneloff - fwaddr, kernellen + rootfsoffpadlen); + kernelfscrc = compute_crc32(kernelfscrc, binfile, kerneloff - fwaddr, kernellen + rootfsoffpadlen + rootfslen + sizeof(deadcode)); } else if ( tagid && (strncmp(tagid, "bc310", TAGID_LEN) == 0) ) { /* Compute the crc32 of the entire image (deadC0de included) */ imagecrc = compute_crc32(imagecrc, binfile, kerneloff - fwaddr, imagelen); @@ -376,7 +381,7 @@ int tagfile(const char *kernel, const char *rootfs, const char *bin, int2tag(tag.bc221.tagIdCRC, crc32(IMAGETAG_CRC_START, (uint8_t*)&(tag.bc221.tagId[0]), TAGID_LEN)); int2tag(tag.bc221.imageCRC, imagecrc); - int2tag(tag.bc221.kernelCRC, kernelcrc); + int2tag(tag.bc221.fskernelCRC, kernelfscrc); int2tag(tag.bc221.headerCRC, crc32(IMAGETAG_CRC_START, (uint8_t*)&tag, sizeof(tag) - 20)); } else if ( tagid && (strcmp(tagid, "bc310") == 0)) { /* Build the tag */