diff options
| author | Dave Liu <r63238@freescale.com> | 2008-02-29 17:45:31 +0800 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2008-03-02 22:47:35 +0100 | 
| commit | ce1120dd703e6f12c59e4eba9962356a0300b832 (patch) | |
| tree | fde6758d165e3a52a0565a85c054fad13e90f581 /fs/ext2/dev.c | |
| parent | 5013c09f7a5675952a3ca88b6bc6c924e63af33e (diff) | |
| download | olio-uboot-2014.01-ce1120dd703e6f12c59e4eba9962356a0300b832.tar.xz olio-uboot-2014.01-ce1120dd703e6f12c59e4eba9962356a0300b832.zip | |
fs: Fix ext2 read issue
The ext2 aligned process will corrupt the key
data struct, the patch fix this.
Signed-off-by: Dave Liu <daveliu@freescale.com>
Diffstat (limited to 'fs/ext2/dev.c')
| -rw-r--r-- | fs/ext2/dev.c | 16 | 
1 files changed, 16 insertions, 0 deletions
| diff --git a/fs/ext2/dev.c b/fs/ext2/dev.c index 643a1a8c8..1728b34fc 100644 --- a/fs/ext2/dev.c +++ b/fs/ext2/dev.c @@ -96,8 +96,23 @@ int ext2fs_devread (int sector, int byte_offset, int byte_len, char *buf) {  		sector++;  	} +	if (byte_len == 0) +		return 1; +  	/*  read sector aligned part */  	block_len = byte_len & ~(SECTOR_SIZE - 1); + +	if (block_len == 0) { +		u8 p[SECTOR_SIZE]; + +		block_len = SECTOR_SIZE; +		ext2fs_block_dev_desc->block_read(ext2fs_block_dev_desc->dev, +						  part_info.start + sector, +						  1, (unsigned long *)p); +		memcpy(buf, p, byte_len); +		return 1; +	} +  	if (ext2fs_block_dev_desc->block_read (ext2fs_block_dev_desc->dev,  					       part_info.start + sector,  					       block_len / SECTOR_SIZE, @@ -106,6 +121,7 @@ int ext2fs_devread (int sector, int byte_offset, int byte_len, char *buf) {  		printf (" ** ext2fs_devread() read error - block\n");  		return (0);  	} +	block_len = byte_len & ~(SECTOR_SIZE - 1);  	buf += block_len;  	byte_len -= block_len;  	sector += block_len / SECTOR_SIZE; |