From 6534b670520f7709b2ba73a853a50372653c4726 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 6 Jun 2011 00:09:11 -0400 Subject: flash_{lock,unlock}: merge functionality The flash_lock util has a bit of extra argument checking, and it supports a magic value of "-1" to mean "all blocks". The flash_unlock util supports automatic 2nd/3rd arguments to unlock the whole flash. It also supports multiple bases (not just hex) for selecting the range of the device to unlock. So tweak both utilities so that they have equivalent functionality again by adding the missing features to each. Signed-off-by: Mike Frysinger Signed-off-by: Artem Bityutskiy --- flash_unlock.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'flash_unlock.c') 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 \n", PROGRAM_NAME); + fprintf(stderr, "USAGE: %s \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]); -- cgit v1.2.3