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 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; }
/* * Clean up an entry with the same name */ static int efi_pstore_erase_func(struct efivar_entry *entry, void *data) { struct pstore_erase_data *ed = data; efi_guid_t vendor = LINUX_EFI_CRASH_GUID; efi_char16_t efi_name_old[DUMP_NAME_LEN]; efi_char16_t *efi_name = ed->name; unsigned long ucs2_len = ucs2_strlen(ed->name); char name_old[DUMP_NAME_LEN]; int i; if (efi_guidcmp(entry->var.VendorGuid, vendor)) return 0; if (ucs2_strncmp(entry->var.VariableName, efi_name, (size_t)ucs2_len)) { /* * Check if an old format, which doesn't support * holding multiple logs, remains. */ sprintf(name_old, "dump-type%u-%u-%lu", ed->type, (unsigned int)ed->id, ed->time.tv_sec); for (i = 0; i < DUMP_NAME_LEN; i++) efi_name_old[i] = name_old[i]; if (ucs2_strncmp(entry->var.VariableName, efi_name_old, ucs2_strlen(efi_name_old))) return 0; } /* found */ __efivar_entry_delete(entry); list_del(&entry->list); return 1; }