Merge branch 'acpica'
[linux-2.6-microblaze.git] / fs / ext4 / dir.c
index 9fdd2b2..9f00fc0 100644 (file)
@@ -72,6 +72,7 @@ int __ext4_check_dir_entry(const char *function, unsigned int line,
        const char *error_msg = NULL;
        const int rlen = ext4_rec_len_from_disk(de->rec_len,
                                                dir->i_sb->s_blocksize);
+       const int next_offset = ((char *) de - buf) + rlen;
 
        if (unlikely(rlen < EXT4_DIR_REC_LEN(1)))
                error_msg = "rec_len is smaller than minimal";
@@ -79,8 +80,11 @@ int __ext4_check_dir_entry(const char *function, unsigned int line,
                error_msg = "rec_len % 4 != 0";
        else if (unlikely(rlen < EXT4_DIR_REC_LEN(de->name_len)))
                error_msg = "rec_len is too small for name_len";
-       else if (unlikely(((char *) de - buf) + rlen > size))
+       else if (unlikely(next_offset > size))
                error_msg = "directory entry overrun";
+       else if (unlikely(next_offset > size - EXT4_DIR_REC_LEN(1) &&
+                         next_offset != size))
+               error_msg = "directory entry too close to block end";
        else if (unlikely(le32_to_cpu(de->inode) >
                        le32_to_cpu(EXT4_SB(dir->i_sb)->s_es->s_inodes_count)))
                error_msg = "inode out of bounds";