efi_loader: check parameters of efi_file_open()
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Wed, 12 Sep 2018 16:43:58 +0000 (18:43 +0200)
committerAlexander Graf <agraf@suse.de>
Sun, 23 Sep 2018 19:55:30 +0000 (21:55 +0200)
Check the parameters of efi_file_open().

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
lib/efi_loader/efi_file.c

index 89d65694da3c8e8de891c196c51ca315d32c94c1..92ca444617508dc040cc8dbb44bfc74d93164155 100644 (file)
@@ -202,15 +202,37 @@ static efi_status_t EFIAPI efi_file_open(struct efi_file_handle *file,
                s16 *file_name, u64 open_mode, u64 attributes)
 {
        struct file_handle *fh = to_fh(file);
+       efi_status_t ret;
 
        EFI_ENTRY("%p, %p, \"%ls\", %llx, %llu", file, new_handle, file_name,
                  open_mode, attributes);
 
-       *new_handle = file_open(fh->fs, fh, file_name, open_mode, attributes);
-       if (!*new_handle)
-               return EFI_EXIT(EFI_NOT_FOUND);
+       /* Check parameters */
+       if (!file || !file || !file_name) {
+               ret = EFI_INVALID_PARAMETER;
+               goto out;
+       }
+       if (open_mode != EFI_FILE_MODE_READ &&
+           open_mode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE) &&
+           open_mode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE |
+                        EFI_FILE_MODE_CREATE)) {
+               ret = EFI_INVALID_PARAMETER;
+               goto out;
+       }
+       if ((!(open_mode & EFI_FILE_MODE_CREATE) && attributes) ||
+           (attributes & (EFI_FILE_READ_ONLY | ~EFI_FILE_VALID_ATTR))) {
+               ret = EFI_INVALID_PARAMETER;
+               goto out;
+       }
 
-       return EFI_EXIT(EFI_SUCCESS);
+       /* Open file */
+       *new_handle = file_open(fh->fs, fh, file_name, open_mode, attributes);
+       if (*new_handle)
+               ret = EFI_SUCCESS;
+       else
+               ret = EFI_NOT_FOUND;
+out:
+       return EFI_EXIT(ret);
 }
 
 static efi_status_t file_close(struct file_handle *fh)