diff options
Diffstat (limited to 'drivers/firmware')
| -rw-r--r-- | drivers/firmware/dmi_scan.c | 12 | ||||
| -rw-r--r-- | drivers/firmware/efi/runtime-map.c | 6 | ||||
| -rw-r--r-- | drivers/firmware/iscsi_ibft.c | 36 | 
3 files changed, 30 insertions, 24 deletions
| diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index 6e45a43ffe84..97b1616aa391 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c @@ -499,19 +499,19 @@ static int __init dmi_present(const u8 *buf)  	buf += 16;  	if (memcmp(buf, "_DMI_", 5) == 0 && dmi_checksum(buf, 15)) { +		if (smbios_ver) +			dmi_ver = smbios_ver; +		else +			dmi_ver = (buf[14] & 0xF0) << 4 | (buf[14] & 0x0F);  		dmi_num = get_unaligned_le16(buf + 12);  		dmi_len = get_unaligned_le16(buf + 6);  		dmi_base = get_unaligned_le32(buf + 8);  		if (dmi_walk_early(dmi_decode) == 0) {  			if (smbios_ver) { -				dmi_ver = smbios_ver; -				pr_info("SMBIOS %d.%d%s present.\n", -					dmi_ver >> 8, dmi_ver & 0xFF, -					(dmi_ver < 0x0300) ? "" : ".x"); +				pr_info("SMBIOS %d.%d present.\n", +				       dmi_ver >> 8, dmi_ver & 0xFF);  			} else { -				dmi_ver = (buf[14] & 0xF0) << 4 | -					   (buf[14] & 0x0F);  				pr_info("Legacy DMI %d.%d present.\n",  				       dmi_ver >> 8, dmi_ver & 0xFF);  			} diff --git a/drivers/firmware/efi/runtime-map.c b/drivers/firmware/efi/runtime-map.c index 87b8e3b900d2..5c55227a34c8 100644 --- a/drivers/firmware/efi/runtime-map.c +++ b/drivers/firmware/efi/runtime-map.c @@ -120,7 +120,8 @@ add_sysfs_runtime_map_entry(struct kobject *kobj, int nr)  	entry = kzalloc(sizeof(*entry), GFP_KERNEL);  	if (!entry) {  		kset_unregister(map_kset); -		return entry; +		map_kset = NULL; +		return ERR_PTR(-ENOMEM);  	}  	memcpy(&entry->md, efi_runtime_map + nr * efi_memdesc_size, @@ -132,6 +133,7 @@ add_sysfs_runtime_map_entry(struct kobject *kobj, int nr)  	if (ret) {  		kobject_put(&entry->kobj);  		kset_unregister(map_kset); +		map_kset = NULL;  		return ERR_PTR(ret);  	} @@ -195,8 +197,6 @@ out_add_entry:  		entry = *(map_entries + j);  		kobject_put(&entry->kobj);  	} -	if (map_kset) -		kset_unregister(map_kset);  out:  	return ret;  } diff --git a/drivers/firmware/iscsi_ibft.c b/drivers/firmware/iscsi_ibft.c index 071c2c969eec..72791232e46b 100644 --- a/drivers/firmware/iscsi_ibft.c +++ b/drivers/firmware/iscsi_ibft.c @@ -186,8 +186,20 @@ struct ibft_kobject {  static struct iscsi_boot_kset *boot_kset; +/* fully null address */  static const char nulls[16]; +/* IPv4-mapped IPv6 ::ffff:0.0.0.0 */ +static const char mapped_nulls[16] = { 0x00, 0x00, 0x00, 0x00, +                                       0x00, 0x00, 0x00, 0x00, +                                       0x00, 0x00, 0xff, 0xff, +                                       0x00, 0x00, 0x00, 0x00 }; + +static int address_not_null(u8 *ip) +{ +	return (memcmp(ip, nulls, 16) && memcmp(ip, mapped_nulls, 16)); +} +  /*   * Helper functions to parse data properly.   */ @@ -445,7 +457,7 @@ static umode_t ibft_check_nic_for(void *data, int type)  		rc = S_IRUGO;  		break;  	case ISCSI_BOOT_ETH_IP_ADDR: -		if (memcmp(nic->ip_addr, nulls, sizeof(nic->ip_addr))) +		if (address_not_null(nic->ip_addr))  			rc = S_IRUGO;  		break;  	case ISCSI_BOOT_ETH_SUBNET_MASK: @@ -456,21 +468,19 @@ static umode_t ibft_check_nic_for(void *data, int type)  		rc = S_IRUGO;  		break;  	case ISCSI_BOOT_ETH_GATEWAY: -		if (memcmp(nic->gateway, nulls, sizeof(nic->gateway))) +		if (address_not_null(nic->gateway))  			rc = S_IRUGO;  		break;  	case ISCSI_BOOT_ETH_PRIMARY_DNS: -		if (memcmp(nic->primary_dns, nulls, -			   sizeof(nic->primary_dns))) +		if (address_not_null(nic->primary_dns))  			rc = S_IRUGO;  		break;  	case ISCSI_BOOT_ETH_SECONDARY_DNS: -		if (memcmp(nic->secondary_dns, nulls, -			   sizeof(nic->secondary_dns))) +		if (address_not_null(nic->secondary_dns))  			rc = S_IRUGO;  		break;  	case ISCSI_BOOT_ETH_DHCP: -		if (memcmp(nic->dhcp, nulls, sizeof(nic->dhcp))) +		if (address_not_null(nic->dhcp))  			rc = S_IRUGO;  		break;  	case ISCSI_BOOT_ETH_VLAN: @@ -536,23 +546,19 @@ static umode_t __init ibft_check_initiator_for(void *data, int type)  		rc = S_IRUGO;  		break;  	case ISCSI_BOOT_INI_ISNS_SERVER: -		if (memcmp(init->isns_server, nulls, -			   sizeof(init->isns_server))) +		if (address_not_null(init->isns_server))  			rc = S_IRUGO;  		break;  	case ISCSI_BOOT_INI_SLP_SERVER: -		if (memcmp(init->slp_server, nulls, -			   sizeof(init->slp_server))) +		if (address_not_null(init->slp_server))  			rc = S_IRUGO;  		break;  	case ISCSI_BOOT_INI_PRI_RADIUS_SERVER: -		if (memcmp(init->pri_radius_server, nulls, -			   sizeof(init->pri_radius_server))) +		if (address_not_null(init->pri_radius_server))  			rc = S_IRUGO;  		break;  	case ISCSI_BOOT_INI_SEC_RADIUS_SERVER: -		if (memcmp(init->sec_radius_server, nulls, -			   sizeof(init->sec_radius_server))) +		if (address_not_null(init->sec_radius_server))  			rc = S_IRUGO;  		break;  	case ISCSI_BOOT_INI_INITIATOR_NAME: |