#include "ext2fsP.h"
#include <ext2fs/ext2_ext_attr.h>
-#ifdef WORDS_BIGENDIAN
void ext2fs_swap_super(struct ext2_super_block * sb)
{
int i;
/* sb->s_mount_opts is __u8 and does not need swabbing */
sb->s_usr_quota_inum = ext2fs_swab32(sb->s_usr_quota_inum);
sb->s_grp_quota_inum = ext2fs_swab32(sb->s_grp_quota_inum);
- sb->s_overhead_blocks = ext2fs_swab32(sb->s_overhead_blocks);
+ sb->s_overhead_clusters = ext2fs_swab32(sb->s_overhead_clusters);
sb->s_backup_bgs[0] = ext2fs_swab32(sb->s_backup_bgs[0]);
sb->s_backup_bgs[1] = ext2fs_swab32(sb->s_backup_bgs[1]);
/* sb->s_encrypt_algos is __u8 and does not need swabbing */
int bufsize)
{
unsigned i, extra_isize, attr_magic;
- int has_extents, has_inline_data, islnk, fast_symlink;
- int inode_size;
+ int has_extents = 0, has_inline_data = 0, islnk = 0, fast_symlink = 0;
+ unsigned int inode_size;
__u32 *eaf, *eat;
/*
errcode_t retval;
char *p, *end;
struct ext2_dir_entry *dirent;
- unsigned int name_len, rec_len;
+ unsigned int name_len, rec_len, left;
p = (char *) buf;
end = (char *) buf + size;
+ left = size;
while (p < end-8) {
dirent = (struct ext2_dir_entry *) p;
dirent->inode = ext2fs_swab32(dirent->inode);
return retval;
if ((rec_len < 8) || (rec_len % 4)) {
rec_len = 8;
- retval = EXT2_ET_DIR_CORRUPTED;
+ if (!(fs->flags & EXT2_FLAG_IGNORE_SWAP_DIRENT))
+ return EXT2_ET_DIR_CORRUPTED;
} else if (((name_len & 0xFF) + 8) > rec_len)
- retval = EXT2_ET_DIR_CORRUPTED;
+ if (!(fs->flags & EXT2_FLAG_IGNORE_SWAP_DIRENT))
+ return EXT2_ET_DIR_CORRUPTED;
+ if (rec_len > left)
+ if (!(fs->flags & EXT2_FLAG_IGNORE_SWAP_DIRENT))
+ return EXT2_ET_DIR_CORRUPTED;
+ left -= rec_len;
p += rec_len;
}
dirent->inode = ext2fs_swab32(dirent->inode);
dirent->rec_len = ext2fs_swab16(dirent->rec_len);
dirent->name_len = ext2fs_swab16(dirent->name_len);
+ if (rec_len > size)
+ return EXT2_ET_DIR_CORRUPTED;
+ size -= rec_len;
if (flags & EXT2_DIRBLOCK_V2_STRUCT)
dirent->name_len = ext2fs_swab16(dirent->name_len);
return 0;
}
-
-#endif