diff options
Diffstat (limited to 'flash_unlock.c')
-rw-r--r-- | flash_unlock.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/flash_unlock.c b/flash_unlock.c index 26721a5..690825d 100644 --- a/flash_unlock.c +++ b/flash_unlock.c @@ -29,7 +29,7 @@ int main(int argc, char *argv[]) * Parse command line options */ if (argc < 2) { - fprintf(stderr, "USAGE: %s <mtd device> <offset in hex> <block count in decimal number>\n", PROGRAM_NAME); + fprintf(stderr, "USAGE: %s <mtd device> <offset> <block count>\n", PROGRAM_NAME); exit(1); } else if (strncmp(argv[1], "/dev/mtd", 8) != 0) { fprintf(stderr, "'%s' is not a MTD device. Must specify mtd device: /dev/mtd?\n", argv[1]); @@ -52,13 +52,26 @@ int main(int argc, char *argv[]) mtdLockInfo.start = strtol(argv[2], NULL, 0); else mtdLockInfo.start = 0; + if (mtdLockInfo.start > mtdInfo.size) { + fprintf(stderr, "%#x is beyond device size %#x\n", + mtdLockInfo.start, mtdInfo.size); + close(fd); + exit(1); + } if (argc > 3) { count = strtol(argv[3], NULL, 0); - mtdLockInfo.length = mtdInfo.erasesize * count; + if (count == -1) + mtdLockInfo.length = mtdInfo.size - mtdInfo.erasesize; + else + mtdLockInfo.length = mtdInfo.erasesize * count; } else { mtdLockInfo.length = mtdInfo.size - mtdInfo.erasesize; } + if (mtdLockInfo.start + mtdLockInfo.length > mtdInfo.size) { + fprintf(stderr, "unlock range is more than device supports\n"); + exit(1); + } if (ioctl(fd, MEMUNLOCK, &mtdLockInfo)) { fprintf(stderr, "Could not unlock MTD device: %s\n", argv[1]); |