From mboxrd@z Thu Jan 1 00:00:00 1970 From: Richard Genoud Date: Thu, 20 May 2021 09:54:16 +0000 Subject: [PATCH] fs/squashfs: fix reading of fragmented files In-Reply-To: <20210517212038.117284-1-jmcosta944@gmail.com> References: <20210517212038.117284-1-jmcosta944@gmail.com> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Le 17/05/2021 ? 23:20, Joao Marcos Costa a ?crit?: > The fragmented files were not correctly read because of two issues: > > - The squashfs_file_info struct has a field named 'comp', which tells if > the file's fragment is compressed or not. This field was always set to > 'true' in sqfs_get_regfile_info and sqfs_get_lregfile_info. It should > actually take sqfs_frag_lookup's return value. This patch addresses > these two assignments. > > - In sqfs_read, the fragments (compressed or not) were copied to the > output buffer through a for loop which was reading data at the wrong > offset. Replace these loops by equivalent calls to memcpy, with the > right parameters. > > I tested this patch by comparing the MD5 checksum of a few fragmented > files with the respective md5sum output in sandbox, considering both > compressed and uncompressed fragments. > > Signed-off-by: Joao Marcos Costa Tested-by: Richard Genoud Tested it on real hardware, with mksquashfs -always-use-fragments, loading a kernel (fit) from squashfs. It wasn't working before the patch, and works after. Thanks ! > --- > fs/squashfs/sqfs.c | 16 ++++++---------- > 1 file changed, 6 insertions(+), 10 deletions(-) > > diff --git a/fs/squashfs/sqfs.c b/fs/squashfs/sqfs.c > index 29805c3c6f..22ef4f2691 100644 > --- a/fs/squashfs/sqfs.c > +++ b/fs/squashfs/sqfs.c > @@ -1253,7 +1253,7 @@ static int sqfs_get_regfile_info(struct squashfs_reg_inode *reg, > fentry); > if (ret < 0) > return -EINVAL; > - finfo->comp = true; > + finfo->comp = ret; > if (fentry->size < 1 || fentry->start == 0x7FFFFFFF) > return -EINVAL; > } else { > @@ -1291,7 +1291,7 @@ static int sqfs_get_lregfile_info(struct squashfs_lreg_inode *lreg, > fentry); > if (ret < 0) > return -EINVAL; > - finfo->comp = true; > + finfo->comp = ret; > if (fentry->size < 1 || fentry->start == 0x7FFFFFFF) > return -EINVAL; > } else { > @@ -1547,20 +1547,16 @@ int sqfs_read(const char *filename, void *buf, loff_t offset, loff_t len, > goto out; > } > > - for (j = *actread; j < finfo.size; j++) { > - memcpy(buf + j, &fragment_block[finfo.offset + j], 1); > - (*actread)++; > - } > + memcpy(buf + *actread, &fragment_block[finfo.offset], finfo.size - *actread); > + *actread = finfo.size; > > free(fragment_block); > > } else if (finfo.frag && !finfo.comp) { > fragment_block = (void *)fragment + table_offset; > > - for (j = *actread; j < finfo.size; j++) { > - memcpy(buf + j, &fragment_block[finfo.offset + j], 1); > - (*actread)++; > - } > + memcpy(buf + *actread, &fragment_block[finfo.offset], finfo.size - *actread); > + *actread = finfo.size; > } > > out: >