Skip to contentSkip to conversation

ext4 crypto: enforce context consistency

DISCUSSION Dan Carpenter 2 participants 2 messages Apr 15, 2015 – Apr 16, 2015

lore
Share & tools
lore
#0 lore raw

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

#1 lore raw
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 to ext4_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