ext4 crypto: enforce context consistency
Hello Theodore Ts'o,
The patch faac02be2843: "ext4 crypto: enforce context consistency" from Apr 12, 2015, leads to the following static checker warning:
fs/ext4/namei.c:1646 ext4_lookup() error: 'inode' dereferencing possible ERR_PTR()
fs/ext4/namei.c
1638 inode = ext4_iget_normal(dir->i_sb, ino);
1639 if (inode == ERR_PTR(-ESTALE)) {
We normally check ext4_iget() against -ESTALE, but then we changed this to ext4_iget_normal() which returns several error values.
1640 EXT4_ERROR_INODE(dir,
1641 "deleted inode referenced: %u",
1642 ino);
1643 return ERR_PTR(-EIO);
1644 }
1645 if (ext4_encrypted_inode(dir) &&
1646 (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
1647 S_ISLNK(inode->i_mode)) &&
1648 !ext4_is_child_context_consistent_with_parent(dir,
1649 inode)) {
1650 iput(inode);
1651 ext4_warning(inode->i_sb,
1652 "Inconsistent encryption contexts: %lu/%lu\n",
1653 (unsigned long) dir->i_ino,
1654 (unsigned long) inode->i_ino);
1655 return ERR_PTR(-EPERM);
1656 }regards,
dan carpenter
Quoted 8 lines · Dan Carpenter
Hello Theodore Ts'o,
The patch
faac02be2843: "ext4 crypto: enforce context consistency" from Apr 12, 2015, leads to the following static checker warning:fs/ext4/namei.c:1646 ext4_lookup() error: 'inode' dereferencing possible ERR_PTR()
Quoted 6 lines
fs/ext4/namei.c
1638 inode =ext4_iget_normal(dir->i_sb, ino);
1639 if (inode ==ERR_PTR(-ESTALE)) {We normally check
ext4_iget()against-ESTALE, but then we changed this toext4_iget_normal()which returns several error values.
Thanks for pointing that out. That's not quite what had happened. We were using ext4_iget_normal() before (and both ext4_iget() and ext4_iget_normal() can return multiple error values), but before we fell out to the bottof of the function where we called d_splice_alias() which would take care of ERR_PTR versions of inode.
We added some additional code between the ext4_iget_normal() and the d_splice_alias() lines, which is what introduced the problem.
I'll take care of fixing it.
Cheers,
- Ted