Author: rmilecki
Date: 2016-05-09 20:10:35 +0200 (Mon, 09 May 2016)
New Revision: 49317

Modified:
   trunk/package/system/mtd/src/mtd.c
   trunk/package/system/mtd/src/mtd.h
   trunk/package/system/mtd/src/trx.c
Log:
mtd: add -c option for specifying amount of data to be used for checksum

So far fixtrx was calculating checksum over amount of data matching
partition erase size. It was mostly a workaround of checksum problem
after changing anything in initial TRX content (e.g. formatting JFFS2).
Its main purpose was to make bootloader accept modified TRX. This didn't
provide much protection of flash data against corruption.

This new option lets caller request calculating checksum over a bigger
amount of data. It may be used e.g. to include whole kernel data for
checksum and hopefully make bootloader go info failsafe mode if
something goes wrong.

Signed-off-by: Rafa{U+0142} Mi{U+0142}ecki <[email protected]>

Modified: trunk/package/system/mtd/src/mtd.c
===================================================================
--- trunk/package/system/mtd/src/mtd.c  2016-05-09 18:10:30 UTC (rev 49316)
+++ trunk/package/system/mtd/src/mtd.c  2016-05-09 18:10:35 UTC (rev 49317)
@@ -737,6 +737,8 @@
        if (mtd_fixtrx) {
            fprintf(stderr,
        "        -o offset               offset of the image header in the 
partition(for fixtrx)\n");
+               fprintf(stderr,
+       "        -c datasize             amount of data to be used for checksum 
calculation (for fixtrx)\n");
        }
        fprintf(stderr,
 #ifdef FIS_SUPPORT
@@ -769,7 +771,7 @@
        int ch, i, boot, imagefd = 0, force, unlocked;
        char *erase[MAX_ARGS], *device = NULL;
        char *fis_layout = NULL;
-       size_t offset = 0, part_offset = 0, dump_len = 0;
+       size_t offset = 0, data_size = 0, part_offset = 0, dump_len = 0;
        enum {
                CMD_ERASE,
                CMD_WRITE,
@@ -793,7 +795,7 @@
 #ifdef FIS_SUPPORT
                        "F:"
 #endif
-                       "frnqe:d:s:j:p:o:l:")) != -1)
+                       "frnqe:d:s:j:p:o:c:l:")) != -1)
                switch (ch) {
                        case 'f':
                                force = 1;
@@ -853,6 +855,14 @@
                                        usage();
                                }
                                break;
+                       case 'c':
+                               errno = 0;
+                               data_size = strtoul(optarg, 0, 0);
+                               if (errno) {
+                                       fprintf(stderr, "-d: illegal numeric 
string\n");
+                                       usage();
+                               }
+                               break;
 #ifdef FIS_SUPPORT
                        case 'F':
                                fis_layout = optarg;
@@ -967,7 +977,7 @@
                        break;
                case CMD_FIXTRX:
                        if (mtd_fixtrx) {
-                               mtd_fixtrx(device, offset);
+                               mtd_fixtrx(device, offset, data_size);
                        }
                        break;
                case CMD_RESETBC:

Modified: trunk/package/system/mtd/src/mtd.h
===================================================================
--- trunk/package/system/mtd/src/mtd.h  2016-05-09 18:10:30 UTC (rev 49316)
+++ trunk/package/system/mtd/src/mtd.h  2016-05-09 18:10:35 UTC (rev 49317)
@@ -25,7 +25,7 @@
 /* target specific functions */
 extern int trx_fixup(int fd, const char *name)  __attribute__ ((weak));
 extern int trx_check(int imagefd, const char *mtd, char *buf, int *len) 
__attribute__ ((weak));
-extern int mtd_fixtrx(const char *mtd, size_t offset) __attribute__ ((weak));
+extern int mtd_fixtrx(const char *mtd, size_t offset, size_t data_size) 
__attribute__ ((weak));
 extern int mtd_fixseama(const char *mtd, size_t offset) __attribute__ ((weak));
 extern int mtd_resetbc(const char *mtd) __attribute__ ((weak));
 #endif /* __mtd_h */

Modified: trunk/package/system/mtd/src/trx.c
===================================================================
--- trunk/package/system/mtd/src/trx.c  2016-05-09 18:10:30 UTC (rev 49316)
+++ trunk/package/system/mtd/src/trx.c  2016-05-09 18:10:35 UTC (rev 49317)
@@ -36,6 +36,8 @@
 #include "crc32.h"
 
 #define TRX_MAGIC       0x30524448      /* "HDR0" */
+#define TRX_CRC32_DATA_OFFSET  12      /* First 12 bytes are not covered by 
CRC32 */
+#define TRX_CRC32_DATA_SIZE    16
 struct trx_header {
        uint32_t magic;         /* "HDR0" */
        uint32_t len;           /* Length of file including header */
@@ -148,8 +150,9 @@
 #endif
 
 int
-mtd_fixtrx(const char *mtd, size_t offset)
+mtd_fixtrx(const char *mtd, size_t offset, size_t data_size)
 {
+       size_t data_offset;
        int fd;
        struct trx_header *trx;
        char *first_block;
@@ -166,10 +169,16 @@
                exit(1);
        }
 
+       data_offset = offset + TRX_CRC32_DATA_OFFSET;
+       if (data_size)
+               data_size += TRX_CRC32_DATA_SIZE;
+       else
+               data_size = erasesize - TRX_CRC32_DATA_OFFSET;
+
        block_offset = offset & ~(erasesize - 1);
        offset -= block_offset;
 
-       if (block_offset + erasesize > mtdsize) {
+       if (data_offset + data_size > mtdsize) {
                fprintf(stderr, "Offset too large, device size 0x%x\n", 
mtdsize);
                exit(1);
        }
@@ -192,7 +201,7 @@
                exit(1);
        }
 
-       if (trx->len == STORE32_LE(erasesize - offset)) {
+       if (trx->len == STORE32_LE(data_size + TRX_CRC32_DATA_OFFSET)) {
                if (quiet < 2)
                        fprintf(stderr, "Header already fixed, exiting\n");
                close(fd);
@@ -199,21 +208,21 @@
                return 0;
        }
 
-       buf = malloc(erasesize);
+       buf = malloc(data_size);
        if (!buf) {
                perror("malloc");
                exit(1);
        }
 
-       res = pread(fd, buf, erasesize, block_offset);
-       if (res != erasesize) {
+       res = pread(fd, buf, data_size, data_offset);
+       if (res != data_size) {
                perror("pread");
                exit(1);
        }
 
-       trx->len = STORE32_LE(erasesize - offset);
+       trx->len = STORE32_LE(data_size + offsetof(struct trx_header, 
flag_version));
 
-       trx->crc32 = STORE32_LE(crc32buf((char*) &trx->flag_version, erasesize 
- offset - 3*4));
+       trx->crc32 = STORE32_LE(crc32buf(buf, data_size));
        if (mtd_erase_block(fd, block_offset)) {
                fprintf(stderr, "Can't erease block at 0x%x (%s)\n", 
block_offset, strerror(errno));
                exit(1);
_______________________________________________
openwrt-commits mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-commits

Reply via email to