ANDROID: squashfs: Fix endianness issue
authorDaniel Rosenberg <drosen@google.com>
Tue, 27 Jun 2017 01:21:56 +0000 (18:21 -0700)
committerAmit Pundir <amit.pundir@linaro.org>
Mon, 10 Jul 2017 10:58:06 +0000 (16:28 +0530)
Code in squashfs_process_blocks was not correctly assigning
length. Casting to u16* introduced endianness issues on some
architectures.

Signed-off-by: Daniel Rosenberg <drosen@google.com>
Bug: 35257858
Change-Id: I9efaef4bc531b7469de79cf94738ade2dd6e6a8c

fs/squashfs/block.c

index 4e3e0863f5eae1567ecf7fac876f38a2b567e40c..b3b95e2ae2ff40fd0837a2a9c41409c9125e4a6d 100644 (file)
@@ -121,11 +121,12 @@ static void squashfs_process_blocks(struct squashfs_read_request *req)
 
        if (req->data_processing == SQUASHFS_METADATA) {
                /* Extract the length of the metadata block */
-               if (req->offset != msblk->devblksize - 1)
-                       length = *((u16 *)(bh[0]->b_data + req->offset));
-               else {
-                       length = bh[0]->b_data[req->offset];
-                       length |= bh[1]->b_data[0] << 8;
+               if (req->offset != msblk->devblksize - 1) {
+                       length = le16_to_cpup((__le16 *)
+                                       (bh[0]->b_data + req->offset));
+               } else {
+                       length = (unsigned char)bh[0]->b_data[req->offset];
+                       length |= (unsigned char)bh[1]->b_data[0] << 8;
                }
                req->compressed = SQUASHFS_COMPRESSED(length);
                req->data_processing = req->compressed ? SQUASHFS_DECOMPRESS