iscsi_ibft: Fix UBSAN shift-out-of-bounds warning in ibft_attr_show_nic()
authorChengen Du <chengen.du@canonical.com>
Tue, 14 Jan 2025 04:12:34 +0000 (12:12 +0800)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Wed, 29 Jan 2025 19:58:31 +0000 (14:58 -0500)
When performing an iSCSI boot using IPv6, iscsistart still reads the
/sys/firmware/ibft/ethernetX/subnet-mask entry. Since the IPv6 prefix
length is 64, this causes the shift exponent to become negative,
triggering a UBSAN warning. As the concept of a subnet mask does not
apply to IPv6, the value is set to ~0 to suppress the warning message.

Signed-off-by: Chengen Du <chengen.du@canonical.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
drivers/firmware/iscsi_ibft.c

index 6e9788324fea5571bf2c51628ad53df4c35e0ea7..371f24569b3b22ee986f7dd48c708d5e2a97cdca 100644 (file)
@@ -310,7 +310,10 @@ static ssize_t ibft_attr_show_nic(void *data, int type, char *buf)
                str += sprintf_ipaddr(str, nic->ip_addr);
                break;
        case ISCSI_BOOT_ETH_SUBNET_MASK:
-               val = cpu_to_be32(~((1 << (32-nic->subnet_mask_prefix))-1));
+               if (nic->subnet_mask_prefix > 32)
+                       val = cpu_to_be32(~0);
+               else
+                       val = cpu_to_be32(~((1 << (32-nic->subnet_mask_prefix))-1));
                str += sprintf(str, "%pI4", &val);
                break;
        case ISCSI_BOOT_ETH_PREFIX_LEN: