diff options
author | Lars Poeschel <larsi@wh2.tu-dresden.de> | 2011-10-12 11:31:19 +0200 |
---|---|---|
committer | Stefan Roese <sr@denx.de> | 2011-10-12 11:33:17 +0200 |
commit | 349a8d5e56db4c0b199123d31ff5c0be67a39a42 (patch) | |
tree | db5fb79d954a9c518cf7bd3506266eed595799c6 /fs | |
parent | 0841ca90f22d73b0ea4642ef1ce33d879bb2f3ff (diff) | |
download | u-boot-349a8d5e56db4c0b199123d31ff5c0be67a39a42.tar.gz u-boot-349a8d5e56db4c0b199123d31ff5c0be67a39a42.tar.xz u-boot-349a8d5e56db4c0b199123d31ff5c0be67a39a42.zip |
ubifs bad superblock bug
This patch fixes an issue when ubifs reads a bad superblock. Later it
tries to free memory, that was not allocated, which freezes u-boot.
This is fixed by looking for a non null pointer before free.
The message I got before u-boot freezes:
UBI: max/mean erase counter: 53/32
UBIFS: mounted UBI device 0, volume 1, name "rootfs"
UBIFS: mounted read-only
UBIFS: file system size: 49140 bytes (50319360 KiB, 0 MiB, 49140 LEBs)
UBIFS: journal size: 49 bytes (6838272 KiB, 0 MiB, 6678 LEBs)
UBIFS: media format: w4/r0 (latest is w4/r0)
UBIFS: default compressor: LZO
UBIFS: reserved for root: 0 bytes (0 KiB)
UBIFS error (pid 0): ubifs_read_node: bad node type (255 but expected 9)
UBIFS error (pid 0): ubifs_read_node: bad node at LEB 330:13104
UBIFS error (pid 0): ubifs_iget: failed to read inode 1, error -22
Error reading superblock on volume 'ubi:rootfs'!
Signed-off-by: Lars Poeschel <larsi@wh2.tu-dresden.de>
Cc: Kyungmin Park <kmpark@infradead.org>
Signed-off-by: Stefan Roese <sr@denx.de>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ubifs/super.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 63b2164d30..26b48f029e 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -848,8 +848,10 @@ void ubifs_umount(struct ubifs_info *c) ubifs_debugging_exit(c); /* Finally free U-Boot's global copy of superblock */ - free(ubifs_sb->s_fs_info); - free(ubifs_sb); + if (ubifs_sb != NULL) { + free(ubifs_sb->s_fs_info); + free(ubifs_sb); + } } /** |