mtd: nand: r852: correct write_buf loop bounds
authorBrian Norris <computersforpeace@gmail.com>
Wed, 21 May 2014 05:47:26 +0000 (22:47 -0700)
committerBrian Norris <computersforpeace@gmail.com>
Wed, 28 May 2014 07:05:26 +0000 (00:05 -0700)
The two loops in r852_write_buf() are designed to handle 4-byte-aligned
and then 1-byte-aligned portions, respectively. However, there are two
issues:

(1) The first loop will only terminate if 'len' is a multiple of 4
(2) The second loop will never terminate if it runs at least once

Rewrite these loops as they were probably intended. Compile tested only.

Issues pointed out by Coverity Scan.

Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Cc: Maxim Levitsky <maximlevitsky@gmail.com>
drivers/mtd/nand/r852.c

index 325930d..baea83f 100644 (file)
@@ -245,7 +245,7 @@ static void r852_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
        }
 
        /* write DWORD chinks - faster */
-       while (len) {
+       while (len >= 4) {
                reg = buf[0] | buf[1] << 8 | buf[2] << 16 | buf[3] << 24;
                r852_write_reg_dword(dev, R852_DATALINE, reg);
                buf += 4;
@@ -254,8 +254,10 @@ static void r852_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
        }
 
        /* write rest */
-       while (len)
+       while (len > 0) {
                r852_write_reg(dev, R852_DATALINE, *buf++);
+               len--;
+       }
 }
 
 /*