Beispiel #1
0
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;
}
Beispiel #3
0
/*
 * 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;
}