]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
mtd: check return values of lseek() and write() in mtd_write_buffer() 23552/head
authorAnna Kiri <bredcorn@gmail.com>
Mon, 8 Jun 2026 09:05:55 +0000 (11:05 +0200)
committerJonas Jelonek <jelonek.jonas@gmail.com>
Mon, 8 Jun 2026 14:17:02 +0000 (16:17 +0200)
Two ignored return values in mtd_write_buffer() caused silent failures:

- lseek() return value was ignored. A failed seek (e.g. EBADF, ESPIPE)
  followed by write() would silently write at the wrong offset.
- write() return value was ignored, silently discarding write errors.
  This could lead to data corruption on the MTD device without any
  indication.

Check both return values, report errors to stderr and return -1 on
failure.

Signed-off-by: Anna Kiri <bredcorn@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/23552
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
package/system/mtd/src/mtd.c

index c7d1ebf9bf0471e0af46f209d58a11ea2cb6908d..e0e1e2b1832c8d364a226f53e8df00ce033ede19 100644 (file)
@@ -183,8 +183,14 @@ int mtd_erase_block(int fd, int offset)
 
 int mtd_write_buffer(int fd, const char *buf, int offset, int length)
 {
-       lseek(fd, offset, SEEK_SET);
-       write(fd, buf, length);
+       if (lseek(fd, offset, SEEK_SET) != offset) {
+               fprintf(stderr, "Failed to seek MTD device: %s\n", strerror(errno));
+               return -1;
+       }
+       if (write(fd, buf, length) != length) {
+               fprintf(stderr, "Short write to MTD device\n");
+               return -1;
+       }
        return 0;
 }