aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Norris <computersforpeace@gmail.com>2010-11-03 01:27:24 -0700
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2010-11-13 13:51:58 +0200
commita3d86d1d7679d082ba2b28b4ad2c57a4dd362df3 (patch)
treeef6b6060bcf85dd4621a3994c4baeec7b32da6b1
parentcba5e67f354b16727f2417d63d726ae1cda70733 (diff)
mtd-utils: nandwrite: avoid NULL buffer pointers
Commit 07005d915d6a79dbdee14b0c4360df5058c3a98b made changes to the buffer allocation in nandwrite and did not handle all affected code areas properly. In particular, we were assigning: oob.ptr = noecc ? oobreadbuf : oobbuf; However, since oobreadbuf and oobbuf are declared dynamically, they are NULL at this point. If they aren't properly assigned later, we unwittingly are passing a NULL pointer as oob buffer. This assignment line is best moved after the buffer allocations and pointer assignment. Effects of this problem can be seen when writing oob data with the "-o" flag and without the "-n" flag: $ ./nandwrite -o /dev/mtd0 img.bin Writing data to block 0 at offset 0x0 ioctl(MEMWRITEOOB): Bad address Data was only partially written due to error : Bad address Signed-off-by: Brian Norris <computersforpeace@gmail.com> Acked-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
-rw-r--r--nandwrite.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/nandwrite.c b/nandwrite.c
index b362c29..8ec5afe 100644
--- a/nandwrite.c
+++ b/nandwrite.c
@@ -391,7 +391,6 @@ int main(int argc, char * const argv[])
}
oob.length = mtd.oob_size;
- oob.ptr = noecc ? oobreadbuf : oobbuf;
/* Determine if we are reading from standard input or from a file. */
if (strcmp(img, standard_input) == 0) {
@@ -594,9 +593,7 @@ int main(int argc, char * const argv[])
}
}
- if (noecc) {
- oob.ptr = oobreadbuf;
- } else {
+ if (!noecc) {
int i, start, len;
int tags_pos = 0;
/*
@@ -630,6 +627,7 @@ int main(int argc, char * const argv[])
}
/* Write OOB data first, as ecc will be placed in there */
oob.start = mtdoffset;
+ oob.ptr = noecc ? oobreadbuf : oobbuf;
if (ioctl(fd, MEMWRITEOOB, &oob) != 0) {
perror("ioctl(MEMWRITEOOB)");
goto closeall;