]> www.infradead.org Git - mtd-utils.git/commitdiff
mtd-utils: nandwrite: avoid NULL buffer pointers
authorBrian Norris <computersforpeace@gmail.com>
Wed, 3 Nov 2010 08:27:24 +0000 (01:27 -0700)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Sat, 13 Nov 2010 11:51:58 +0000 (13:51 +0200)
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>
nandwrite.c

index b362c291ceb29dc8f08cb0c2d36d6c00e4352fea..8ec5afeb4e9feb5596c382d60bd6f43add566eb4 100644 (file)
@@ -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;