diff mbox

[U-Boot] fs/fat: Fix unaligned __u16 reads for FAT12 access

Message ID 2b77133c2d5a409793fcd8d4764b40fc@rwthex-w2-b.rwth-ad.de
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Stefan Brüns Jan. 26, 2017, 5:55 p.m. UTC
Doing unaligned reads is not supported on all architectures, use
byte sized reads of the little endian buffer.
Rename off16 to off8, as it reflects the buffer offset in byte
granularity (offset is in entry, i.e. 12 bit, granularity).
Fix a regression introduced in 8d48c92b45aea91e2a2be90f2ed93677e85526f1

Reported-by: Oleksandr Tymoshenko <gonzo@bluezbox.com>
Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>

---
 fs/fat/fat.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

-- 
2.11.0
diff mbox

Patch

diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index fe899d0442..06088e2421 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -179,7 +179,7 @@  int flush_dirty_fat_buffer(fsdata *mydata)
 static __u32 get_fatent(fsdata *mydata, __u32 entry)
 {
 	__u32 bufnum;
-	__u32 off16, offset;
+	__u32 offset, off8;
 	__u32 ret = 0x00;
 
 	if (CHECK_CLUST(entry, mydata->fatsize)) {
@@ -242,8 +242,9 @@  static __u32 get_fatent(fsdata *mydata, __u32 entry)
 		ret = FAT2CPU16(((__u16 *) mydata->fatbuf)[offset]);
 		break;
 	case 12:
-		off16 = (offset * 3) / 2;
-		ret = FAT2CPU16(*(__u16 *)(mydata->fatbuf + off16));
+		off8 = (offset * 3) / 2;
+		/* fatbut + off8 may be unaligned, read in byte granularity */
+		ret = mydata->fatbuf[off8] + mydata->fatbuf[off8 + 1] << 8;
 
 		if (offset & 0x1)
 			ret >>= 4;