|
@@ -397,8 +397,19 @@ int ovl_verify_index(struct dentry *index, struct path *lowerstack,
|
|
|
if (!d_inode(index))
|
|
|
return 0;
|
|
|
|
|
|
- err = -EISDIR;
|
|
|
- if (d_is_dir(index))
|
|
|
+ /*
|
|
|
+ * Directory index entries are going to be used for looking up
|
|
|
+ * redirected upper dirs by lower dir fh when decoding an overlay
|
|
|
+ * file handle of a merge dir. Whiteout index entries are going to be
|
|
|
+ * used as an indication that an exported overlay file handle should
|
|
|
+ * be treated as stale (i.e. after unlink of the overlay inode).
|
|
|
+ * We don't know the verification rules for directory and whiteout
|
|
|
+ * index entries, because they have not been implemented yet, so return
|
|
|
+ * EROFS if those entries are found to avoid corrupting an index that
|
|
|
+ * was created by a newer kernel.
|
|
|
+ */
|
|
|
+ err = -EROFS;
|
|
|
+ if (d_is_dir(index) || ovl_is_whiteout(index))
|
|
|
goto fail;
|
|
|
|
|
|
err = -EINVAL;
|
|
@@ -436,8 +447,8 @@ out:
|
|
|
return err;
|
|
|
|
|
|
fail:
|
|
|
- pr_warn_ratelimited("overlayfs: failed to verify index (%pd2, err=%i)\n",
|
|
|
- index, err);
|
|
|
+ pr_warn_ratelimited("overlayfs: failed to verify index (%pd2, ftype=%x, err=%i)\n",
|
|
|
+ index, d_inode(index)->i_mode & S_IFMT, err);
|
|
|
goto out;
|
|
|
}
|
|
|
|