* [U-Boot] [PATCH] UBIFS: Change ubifsload to not read beyond the requested size
@ 2010-10-29 9:04 Stefan Roese
2010-10-29 14:01 ` Ben Gardiner
2010-10-29 20:54 ` Wolfgang Denk
0 siblings, 2 replies; 5+ messages in thread
From: Stefan Roese @ 2010-10-29 9:04 UTC (permalink / raw)
To: u-boot
Until now ubifsload pads the destination with 0 up to a multiple of
UBIFS_BLOCK_SIZE (4KiB) while reading a file to memory. This patch
changes this behaviour to only read to the requested length. This
is either the file length or the length/size provided as parameter
to the ubifsload command.
Signed-off-by: Stefan Roese <sr@denx.de>
---
This patch makes the patch [UBIFS: Add padded size to ubifsload output]
posted yesterday obsolete since we're not padding any more now.
Stefan
fs/ubifs/ubifs.c | 58 ++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 44 insertions(+), 14 deletions(-)
diff --git a/fs/ubifs/ubifs.c b/fs/ubifs/ubifs.c
index 8215443..e49ae6f 100644
--- a/fs/ubifs/ubifs.c
+++ b/fs/ubifs/ubifs.c
@@ -3,7 +3,7 @@
*
* Copyright (C) 2006-2008 Nokia Corporation.
*
- * (C) Copyright 2008-2009
+ * (C) Copyright 2008-2010
* Stefan Roese, DENX Software Engineering, sr at denx.de.
*
* This program is free software; you can redistribute it and/or modify it
@@ -567,7 +567,8 @@ dump:
return -EINVAL;
}
-static int do_readpage(struct ubifs_info *c, struct inode *inode, struct page *page)
+static int do_readpage(struct ubifs_info *c, struct inode *inode,
+ struct page *page, int last_block_size)
{
void *addr;
int err = 0, i;
@@ -601,17 +602,39 @@ static int do_readpage(struct ubifs_info *c, struct inode *inode, struct page *p
err = -ENOENT;
memset(addr, 0, UBIFS_BLOCK_SIZE);
} else {
- ret = read_block(inode, addr, block, dn);
- if (ret) {
- err = ret;
- if (err != -ENOENT)
- break;
- } else if (block + 1 == beyond) {
- int dlen = le32_to_cpu(dn->size);
- int ilen = i_size & (UBIFS_BLOCK_SIZE - 1);
-
- if (ilen && ilen < dlen)
- memset(addr + ilen, 0, dlen - ilen);
+ /*
+ * Reading last block? Make sure to not write beyond
+ * the requested size.
+ */
+ if (((block + 1) == beyond) || last_block_size) {
+ void *buff;
+ int dlen;
+
+ /*
+ * We need to buffer the data locally for the
+ * last block. This is to not pad the destination
+ * area to a multiple of UBIFS_BLOCK_SIZE.
+ */
+ buff = malloc(UBIFS_BLOCK_SIZE);
+
+ /* Read block-siez into temp buffer */
+ ret = read_block(inode, buff, block, dn);
+ if (last_block_size)
+ dlen = last_block_size;
+ else
+ dlen = le32_to_cpu(dn->size);
+
+ /* Now copy required size back to dest */
+ memcpy(addr, buff, dlen);
+
+ free(buff);
+ } else {
+ ret = read_block(inode, addr, block, dn);
+ if (ret) {
+ err = ret;
+ if (err != -ENOENT)
+ break;
+ }
}
}
if (++i >= UBIFS_BLOCKS_PER_PAGE)
@@ -649,6 +672,7 @@ int ubifs_load(char *filename, u32 addr, u32 size)
int err = 0;
int i;
int count;
+ int last_block_size = 0;
c->ubi = ubi_open_volume(c->vi.ubi_num, c->vi.vol_id, UBI_READONLY);
/* ubifs_findfile will resolve symlinks, so we know that we get
@@ -684,7 +708,13 @@ int ubifs_load(char *filename, u32 addr, u32 size)
page.index = 0;
page.inode = inode;
for (i = 0; i < count; i++) {
- err = do_readpage(c, inode, &page);
+ /*
+ * Make sure to not read beyond the requested size
+ */
+ if (((i + 1) == count) && (size < inode->i_size))
+ last_block_size = size - (i * PAGE_SIZE);
+
+ err = do_readpage(c, inode, &page, last_block_size);
if (err)
break;
--
1.7.3.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [U-Boot] [PATCH] UBIFS: Change ubifsload to not read beyond the requested size
2010-10-29 9:04 [U-Boot] [PATCH] UBIFS: Change ubifsload to not read beyond the requested size Stefan Roese
@ 2010-10-29 14:01 ` Ben Gardiner
2010-11-01 15:47 ` Stefan Roese
2010-10-29 20:54 ` Wolfgang Denk
1 sibling, 1 reply; 5+ messages in thread
From: Ben Gardiner @ 2010-10-29 14:01 UTC (permalink / raw)
To: u-boot
On Fri, Oct 29, 2010 at 5:04 AM, Stefan Roese <sr@denx.de> wrote:
> Until now ubifsload pads the destination with 0 up to a multiple of
> UBIFS_BLOCK_SIZE (4KiB) while reading a file to memory. This patch
> changes this behaviour to only read to the requested length. This
> is either the file length or the length/size provided as parameter
> to the ubifsload command.
>
> Signed-off-by: Stefan Roese <sr@denx.de>
> ---
> [...]
> + ? ? ? ? ? ? ? ? ? ? ? /*
> + ? ? ? ? ? ? ? ? ? ? ? ?* Reading last block? Make sure to not write beyond
> + ? ? ? ? ? ? ? ? ? ? ? ?* the requested size.
> + ? ? ? ? ? ? ? ? ? ? ? ?*/
s/write/read/
> [...]
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Read block-siez into temp buffer */
s/siez/size/
Applies to 908614f20f7f0f5df736eed21b88e81ebbf14e86 of
git://git.denx.de/u-boot.git.
One checkpatch warning:
WARNING: line over 80 characters
#134: FILE: fs/ubifs/ubifs.c:615:
+ * last block. This is to not pad the
destination
total: 0 errors, 1 warnings, 88 lines checked
Tested on da850evm with NAND, env.oob enabled. Loaded a uImage from
ubifs and booted it.
Tested-by: Ben Gardiner <bengardiner@nanometrics.ca>
Best Regards,
Ben Gardiner
---
Nanometrics Inc.
http://www.nanometrics.ca
^ permalink raw reply [flat|nested] 5+ messages in thread
* [U-Boot] [PATCH] UBIFS: Change ubifsload to not read beyond the requested size
2010-10-29 9:04 [U-Boot] [PATCH] UBIFS: Change ubifsload to not read beyond the requested size Stefan Roese
2010-10-29 14:01 ` Ben Gardiner
@ 2010-10-29 20:54 ` Wolfgang Denk
2010-11-01 13:06 ` Stefan Roese
1 sibling, 1 reply; 5+ messages in thread
From: Wolfgang Denk @ 2010-10-29 20:54 UTC (permalink / raw)
To: u-boot
Dear Stefan Roese,
In message <1288343093-31276-1-git-send-email-sr@denx.de> you wrote:
> Until now ubifsload pads the destination with 0 up to a multiple of
> UBIFS_BLOCK_SIZE (4KiB) while reading a file to memory. This patch
> changes this behaviour to only read to the requested length. This
> is either the file length or the length/size provided as parameter
> to the ubifsload command.
>
> Signed-off-by: Stefan Roese <sr@denx.de>
> ---
> This patch makes the patch [UBIFS: Add padded size to ubifsload output]
> posted yesterday obsolete since we're not padding any more now.
...
> + /*
> + * We need to buffer the data locally for the
> + * last block. This is to not pad the destination
> + * area to a multiple of UBIFS_BLOCK_SIZE.
> + */
> + buff = malloc(UBIFS_BLOCK_SIZE);
> +
> + /* Read block-siez into temp buffer */
> + ret = read_block(inode, buff, block, dn);
> + if (last_block_size)
> + dlen = last_block_size;
> + else
> + dlen = le32_to_cpu(dn->size);
How about some error handling?
malloc() can fail, and read_block() can fail as well.
> + /* Now copy required size back to dest */
> + memcpy(addr, buff, dlen);
> +
> + free(buff);
> + } else {
> + ret = read_block(inode, addr, block, dn);
> + if (ret) {
> + err = ret;
> + if (err != -ENOENT)
> + break;
or simpler:
ret = read_block(inode, addr, block, dn);
if (ret != -ENOENT) {
err = ret;
break;
}
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"I used to think that the brain was the most wonderful organ in my
body. Then I realized who was telling me this." - Emo Phillips
^ permalink raw reply [flat|nested] 5+ messages in thread
* [U-Boot] [PATCH] UBIFS: Change ubifsload to not read beyond the requested size
2010-10-29 20:54 ` Wolfgang Denk
@ 2010-11-01 13:06 ` Stefan Roese
0 siblings, 0 replies; 5+ messages in thread
From: Stefan Roese @ 2010-11-01 13:06 UTC (permalink / raw)
To: u-boot
Hi Wolfgang,
On Friday 29 October 2010 22:54:04 Wolfgang Denk wrote:
> > + buff = malloc(UBIFS_BLOCK_SIZE);
> > +
> > + /* Read block-siez into temp buffer */
> > + ret = read_block(inode, buff, block, dn);
> > + if (last_block_size)
> > + dlen = last_block_size;
> > + else
> > + dlen = le32_to_cpu(dn->size);
>
> How about some error handling?
>
> malloc() can fail, and read_block() can fail as well.
Right. I'll change this and send an updated version.
Thanks for the review.
Cheers,
Stefan
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-0 Fax: (+49)-8142-66989-80 Email: office at denx.de
^ permalink raw reply [flat|nested] 5+ messages in thread
* [U-Boot] [PATCH] UBIFS: Change ubifsload to not read beyond the requested size
2010-10-29 14:01 ` Ben Gardiner
@ 2010-11-01 15:47 ` Stefan Roese
0 siblings, 0 replies; 5+ messages in thread
From: Stefan Roese @ 2010-11-01 15:47 UTC (permalink / raw)
To: u-boot
Hi Ben,
On Friday 29 October 2010 16:01:18 Ben Gardiner wrote:
> On Fri, Oct 29, 2010 at 5:04 AM, Stefan Roese <sr@denx.de> wrote:
> > Until now ubifsload pads the destination with 0 up to a multiple of
> > UBIFS_BLOCK_SIZE (4KiB) while reading a file to memory. This patch
> > changes this behaviour to only read to the requested length. This
> > is either the file length or the length/size provided as parameter
> > to the ubifsload command.
> >
> > Signed-off-by: Stefan Roese <sr@denx.de>
> > ---
> > [...]
> > + /*
> > + * Reading last block? Make sure to not write
> > beyond + * the requested size.
> > + */
>
> s/write/read/
No. This refers to not writing beyond the requested size in the destination
buffer. So that nothing will be overwritten by this 4KiB padding. I'll change
this comment a bit to make this clearer in the next patch version.
> > [...]
> > + /* Read block-siez into temp buffer */
>
> s/siez/size/
Thanks for catching. Will change.
Cheers,
Stefan
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-0 Fax: (+49)-8142-66989-80 Email: office at denx.de
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2010-11-01 15:47 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-10-29 9:04 [U-Boot] [PATCH] UBIFS: Change ubifsload to not read beyond the requested size Stefan Roese
2010-10-29 14:01 ` Ben Gardiner
2010-11-01 15:47 ` Stefan Roese
2010-10-29 20:54 ` Wolfgang Denk
2010-11-01 13:06 ` Stefan Roese
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.