]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
efivarfs: Fix error on non-existent file
authorJames Bottomley <James.Bottomley@HansenPartnership.com>
Sun, 8 Dec 2024 18:34:13 +0000 (13:34 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 27 Dec 2024 12:52:55 +0000 (13:52 +0100)
commit 2ab0837cb91b7de507daa145d17b3b6b2efb3abf upstream.

When looking up a non-existent file, efivarfs returns -EINVAL if the
file does not conform to the NAME-GUID format and -ENOENT if it does.
This is caused by efivars_d_hash() returning -EINVAL if the name is not
formatted correctly.  This error is returned before simple_lookup()
returns a negative dentry, and is the error value that the user sees.

Fix by removing this check.  If the file does not exist, simple_lookup()
will return a negative dentry leading to -ENOENT and efivarfs_create()
already has a validity check before it creates an entry (and will
correctly return -EINVAL)

Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: <stable@vger.kernel.org>
[ardb: make efivarfs_valid_name() static]
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/efivarfs/inode.c
fs/efivarfs/internal.h
fs/efivarfs/super.c

index 939e5e242b985bd8aa6024bc716c70afb549e492..b3dc7ff42400feb5bf9e0af07014154f4987eea6 100644 (file)
@@ -47,7 +47,7 @@ struct inode *efivarfs_get_inode(struct super_block *sb,
  *
  *     VariableName-12345678-1234-1234-1234-1234567891bc
  */
-bool efivarfs_valid_name(const char *str, int len)
+static bool efivarfs_valid_name(const char *str, int len)
 {
        const char *s = str + len - EFI_VARIABLE_GUID_LEN;
 
index 8ebf3a6a8aa2d620e5960530378ca8fd6ad84e34..dcb973d8736cd60141f4dd3e0486952cfd82bd58 100644 (file)
@@ -50,7 +50,6 @@ bool efivar_variable_is_removable(efi_guid_t vendor, const char *name,
 
 extern const struct file_operations efivarfs_file_operations;
 extern const struct inode_operations efivarfs_dir_inode_operations;
-extern bool efivarfs_valid_name(const char *str, int len);
 extern struct inode *efivarfs_get_inode(struct super_block *sb,
                        const struct inode *dir, int mode, dev_t dev,
                        bool is_removable);
index 77c7615bba5e13f71249a38b064b4d6445c76fd9..b8c4641ed152b0a2e798df54f21d84c550f2b27e 100644 (file)
@@ -64,9 +64,6 @@ static int efivarfs_d_hash(const struct dentry *dentry, struct qstr *qstr)
        const unsigned char *s = qstr->name;
        unsigned int len = qstr->len;
 
-       if (!efivarfs_valid_name(s, len))
-               return -EINVAL;
-
        while (len-- > EFI_VARIABLE_GUID_LEN)
                hash = partial_name_hash(*s++, hash);