[PATCH 1/4] efi_runtime: add VariableNameSize return when getting the EFI_BUFFER_TOO_SMALL
Ivan Hu
ivan.hu at canonical.com
Mon Aug 22 09:08:37 UTC 2016
VariableNameSize is required to return when getting the EFI_BUFFER_TOO_SMALL
for user to obtain and set the required data buffer size on GetNextVariableName
runtime service.
Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
---
efi_runtime/efi_runtime.c | 52 ++++++++++++++++++++++++++++++-----------------
1 file changed, 33 insertions(+), 19 deletions(-)
diff --git a/efi_runtime/efi_runtime.c b/efi_runtime/efi_runtime.c
index 5ac9781..c60a6d8 100644
--- a/efi_runtime/efi_runtime.c
+++ b/efi_runtime/efi_runtime.c
@@ -334,7 +334,7 @@ static long efi_runtime_get_time(unsigned long arg)
return -EFAULT;
}
if (gettime.time) {
- if(copy_to_user(gettime.time, &efi_time, sizeof(efi_time_t)))
+ if (copy_to_user(gettime.time, &efi_time, sizeof(efi_time_t)))
return -EFAULT;
}
@@ -488,33 +488,47 @@ static long efi_runtime_get_nextvariablename(unsigned long arg)
status = efi.get_next_variable(ns, name, vd);
- if (name) {
- rv = copy_ucs2_to_user_len(
- getnextvariablename.variable_name,
- name, prev_name_size);
- kfree(name);
- if (rv)
- return -EFAULT;
+ if (put_user(status, getnextvariablename.status)) {
+ rv = -EFAULT;
+ goto out;
}
- if (put_user(status, getnextvariablename.status))
- return -EFAULT;
+ if (status != EFI_SUCCESS) {
+ if (status == EFI_BUFFER_TOO_SMALL) {
+ if (ns && put_user(*ns,
+ getnextvariablename.variable_name_size)) {
+ rv = -EFAULT;
+ goto out;
+ }
+ }
+ rv = -EINVAL;
+ goto out;
+ }
+
+ if (name) {
+ if (copy_ucs2_to_user_len(getnextvariablename.variable_name,
+ name, prev_name_size)) {
+ rv = -EFAULT;
+ goto out;
+ }
+ }
if (ns) {
- if (put_user(*ns,
- getnextvariablename.variable_name_size))
- return -EFAULT;
+ if (put_user(*ns, getnextvariablename.variable_name_size)) {
+ rv = -EFAULT;
+ goto out;
+ }
}
if (vd) {
- if (copy_to_user(getnextvariablename.vendor_guid,
- vd, sizeof(efi_guid_t)))
- return -EFAULT;
+ if (copy_to_user(getnextvariablename.vendor_guid, vd,
+ sizeof(efi_guid_t)))
+ rv = -EFAULT;
}
- if (status != EFI_SUCCESS)
- return -EINVAL;
- return 0;
+out:
+ kfree(name);
+ return rv;
}
static long efi_runtime_get_nexthighmonocount(unsigned long arg)
--
1.9.1
More information about the fwts-devel
mailing list