static ssize_t efivar_delete(struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf, loff_t pos, size_t count) { struct efi_variable *del_var = (struct efi_variable *)buf; struct efivar_entry *entry; int err = 0; if (!capable(CAP_SYS_ADMIN)) return -EACCES; efivar_entry_iter_begin(); entry = efivar_entry_find(del_var->VariableName, del_var->VendorGuid, &efivar_sysfs_list, true); if (!entry) err = -EINVAL; else if (__efivar_entry_delete(entry)) err = -EIO; efivar_entry_iter_end(); if (err) return err; efivar_unregister(entry); /* It's dead Jim.... */ return count; }
static int efivar_update_sysfs_entry(efi_char16_t *name, efi_guid_t vendor, unsigned long name_size, void *data) { struct efivar_entry *entry = data; if (efivar_entry_find(name, vendor, &efivar_sysfs_list, false)) return 0; memcpy(entry->var.VariableName, name, name_size); memcpy(&(entry->var.VendorGuid), &vendor, sizeof(efi_guid_t)); return 1; }
static ssize_t efivar_delete(struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf, loff_t pos, size_t count) { struct efi_variable *del_var = (struct efi_variable *)buf; struct compat_efi_variable *compat; struct efivar_entry *entry; efi_char16_t *name; efi_guid_t vendor; int err = 0; if (!capable(CAP_SYS_ADMIN)) return -EACCES; if (is_compat()) { if (count != sizeof(*compat)) return -EINVAL; compat = (struct compat_efi_variable *)buf; name = compat->VariableName; vendor = compat->VendorGuid; } else { if (count != sizeof(*del_var)) return -EINVAL; name = del_var->VariableName; vendor = del_var->VendorGuid; } efivar_entry_iter_begin(); entry = efivar_entry_find(name, vendor, &efivar_sysfs_list, true); if (!entry) err = -EINVAL; else if (__efivar_entry_delete(entry)) err = -EIO; if (err) { efivar_entry_iter_end(); return err; } if (!entry->scanning) { efivar_entry_iter_end(); efivar_unregister(entry); } else efivar_entry_iter_end(); /* It's dead Jim.... */ return count; }