Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion fs/isofs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,9 @@ static int do_isofs_readdir(struct inode *inode, struct file *file,
int map;
int first_de = 1;
char *p = NULL; /* Quiet GCC */
u8 record[256];
struct iso_directory_record *de;
struct iso_directory_record *tmpde = (void *)record;
struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb);

offset = ctx->pos & (bufsize - 1);
Expand Down Expand Up @@ -133,7 +135,25 @@ static int do_isofs_readdir(struct inode *inode, struct file *file,
offset_saved = offset;
offset += de_len;

if (!isofs_dir_record_valid(de, offset_saved, bufsize)) {
/* A record may span blocks within a logical sector. */
if (offset > bufsize &&
de_len <= ISOFS_BLOCK_SIZE -
(ctx->pos & (ISOFS_BLOCK_SIZE - 1))) {
unsigned int slop = bufsize - offset_saved;

memcpy(tmpde, de, slop);
offset &= bufsize - 1;
block++;
brelse(bh);
bh = isofs_bread(inode, block);
if (!bh)
return -EIO;
memcpy((char *)tmpde + slop, bh->b_data, offset);
de = tmpde;
}

if (!isofs_dir_record_valid(de, de == tmpde ? 0 : offset_saved,
de == tmpde ? de_len : bufsize)) {
printk(KERN_NOTICE "iso9660: Corrupted directory entry"
" in block %lu of inode %llu\n", block,
inode->i_ino);
Expand Down
22 changes: 21 additions & 1 deletion fs/isofs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
unsigned char bufbits = ISOFS_BUFFER_BITS(dir);
unsigned long block, f_pos, offset, block_saved, offset_saved;
struct buffer_head *bh = NULL;
u8 record[256];
struct iso_directory_record *tmpde = (void *)record;
struct isofs_sb_info *sbi = ISOFS_SB(dir->i_sb);

if (!ISOFS_I(dir)->i_first_extent)
Expand Down Expand Up @@ -91,7 +93,25 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
offset += de_len;
f_pos += de_len;

if (!isofs_dir_record_valid(de, offset_saved, bufsize)) {
/* A record may span blocks within a logical sector. */
if (offset > bufsize &&
de_len <= ISOFS_BLOCK_SIZE -
((f_pos - de_len) & (ISOFS_BLOCK_SIZE - 1))) {
unsigned int slop = bufsize - offset_saved;

memcpy(tmpde, de, slop);
offset &= bufsize - 1;
block++;
brelse(bh);
bh = isofs_bread(dir, block);
if (!bh)
return 0;
memcpy((char *)tmpde + slop, bh->b_data, offset);
de = tmpde;
}

if (!isofs_dir_record_valid(de, de == tmpde ? 0 : offset_saved,
de == tmpde ? de_len : bufsize)) {
printk(KERN_NOTICE "iso9660: Corrupted directory entry"
" in block %lu of inode %llu\n", block,
dir->i_ino);
Expand Down
Loading