Commit 200f5d7b authored by Shaozhengchao's avatar Shaozhengchao Committed by Yang Yingliang
Browse files

net/hinic: driver code compliance rectification



driver inclusion
category:bugfix
bugzilla:4472
CVE:NA

-----------------------------------------------------------------------

hinic driver code compliance rectification.
1.Process return value of snprintf and sscanf function.
2.Modify devil number.

Signed-off-by: default avatarShaozhengchao <shaozhengchao@huawei.com>
Reviewed-by: default avatarLuoshaokai <luoshaokai@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
parent 2b34ce42
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -768,7 +768,7 @@ int dbgtool_knl_init(void *vhwdev, void *chip_node)
	sema_init(&dbgtool_info->dbgtool_sem, 1);

	ret = sscanf(chip_info->chip_name, HINIC_CHIP_NAME "%d", &id);
	if (ret < 0) {
	if (ret <= 0) {
		pr_err("Failed to get hinic id\n");
		goto sscanf_chdev_fail;
	}
@@ -874,7 +874,7 @@ void dbgtool_knl_deinit(void *vhwdev, void *chip_node)
		return;

	err = sscanf(chip_info->chip_name, HINIC_CHIP_NAME "%d", &id);
	if (err < 0)
	if (err <= 0)
		pr_err("Failed to get hinic id\n");

	g_card_node_array[id] = NULL;
+18 −6
Original line number Diff line number Diff line
@@ -1133,15 +1133,27 @@ static int init_eq(struct hinic_eq *eq, struct hinic_hwdev *hwdev, u16 q_id,
	}

	if (type == HINIC_AEQ) {
		snprintf(eq->irq_name, sizeof(eq->irq_name),
		err = snprintf(eq->irq_name, sizeof(eq->irq_name),
			       "hinic_aeq%d@pci:%s", eq->q_id,
			       pci_name(hwdev->pcidev_hdl));
		if (err <= 0 || err >= (int)sizeof(eq->irq_name)) {
			pr_err("Failed snprintf irq_name, function return(%d) and dest_len(%d)\n",
			       err, (int)sizeof(eq->irq_name));
			err = -EINVAL;
			goto req_irq_err;
		}
		err = request_irq(entry->irq_id, aeq_interrupt, 0UL,
				  eq->irq_name, eq);
	} else {
		snprintf(eq->irq_name, sizeof(eq->irq_name),
		err = snprintf(eq->irq_name, sizeof(eq->irq_name),
			       "hinic_ceq%d@pci:%s", eq->q_id,
			       pci_name(hwdev->pcidev_hdl));
		if (err <= 0 || err >= (int)sizeof(eq->irq_name)) {
			pr_err("Failed snprintf irq_name, function return(%d) and dest_len(%d)\n",
			       err, (int)sizeof(eq->irq_name));
			err = -EINVAL;
			goto req_irq_err;
		}
		err = request_irq(entry->irq_id, ceq_interrupt, 0UL,
				  eq->irq_name, eq);
	}
+45 −11
Original line number Diff line number Diff line
@@ -294,12 +294,15 @@ u32 hinic_get_io_stats_size(struct hinic_nic_dev *nic_dev)
}

#define QUEUE_STATS_PACK(items, item_idx, array, stats_ptr, qid) {	\
	int j;								\
	int j, err;							\
	for (j = 0; j < ARRAY_LEN(array); j++) {			\
		memcpy((items)[item_idx].name, (array)[j].name,		\
		       HINIC_SHOW_ITEM_LEN);				\
		snprintf((items)[item_idx].name, HINIC_SHOW_ITEM_LEN,	\
		err = snprintf((items)[item_idx].name, HINIC_SHOW_ITEM_LEN,\
			 (array)[j].name, (qid));			\
		if (err <= 0 || err >= HINIC_SHOW_ITEM_LEN)		\
			pr_err("Failed snprintf: func_ret(%d), dest_len(%d)\n",\
				err, HINIC_SHOW_ITEM_LEN);		\
		(items)[item_idx].hexadecimal = 0;			\
		(items)[item_idx].value =				\
			GET_VALUE_OF_PTR((array)[j].size,		\
@@ -335,6 +338,8 @@ void hinic_get_io_stats(struct hinic_nic_dev *nic_dev,

#define LP_DEFAULT_TIME                 (5) /* seconds */
#define LP_PKT_LEN                      (1514)
#define OBJ_STR_MAX_LEN			(32)
#define SET_LINK_STR_MAX_LEN		(128)

#define PORT_DOWN_ERR_IDX  0
enum diag_test_index {
@@ -743,16 +748,28 @@ static int hinic_set_settings_to_hw(struct hinic_nic_dev *nic_dev,
	struct net_device *netdev = nic_dev->netdev;
	struct hinic_link_ksettings settings = {0};
	enum nic_speed_level speed_level = 0;
	char set_link_str[128] = {0};
	char set_link_str[SET_LINK_STR_MAX_LEN] = {0};
	int err = 0;

	snprintf(set_link_str, sizeof(set_link_str), "%s",
	err = snprintf(set_link_str, sizeof(set_link_str), "%s",
		       (set_settings & HILINK_LINK_SET_AUTONEG) ?
		       (autoneg ? "autong enable " : "autong disable ") : "");
	if (err < 0 || err >= SET_LINK_STR_MAX_LEN) {
		nicif_err(nic_dev, drv, netdev,
			  "Failed snprintf link state, function return(%d) and dest_len(%d)\n",
			  err, SET_LINK_STR_MAX_LEN);
		return -EFAULT;
	}
	if (set_settings & HILINK_LINK_SET_SPEED) {
		speed_level = hinic_ethtool_to_hw_speed_level(speed);
		snprintf(set_link_str, sizeof(set_link_str),
		err = snprintf(set_link_str, sizeof(set_link_str),
			       "%sspeed %d ", set_link_str, speed);
		if (err <= 0 || err >= SET_LINK_STR_MAX_LEN) {
			nicif_err(nic_dev, drv, netdev,
				  "Failed snprintf link speed, function return(%d) and dest_len(%d)\n",
				  err, SET_LINK_STR_MAX_LEN);
			return -EFAULT;
		}
	}

	settings.valid_bitmap = set_settings;
@@ -883,7 +900,12 @@ static void hinic_get_drvinfo(struct net_device *netdev,
		return;
	}

	snprintf(info->fw_version, sizeof(info->fw_version), "%s", mgmt_ver);
	err = snprintf(info->fw_version, sizeof(info->fw_version),
		       "%s", mgmt_ver);
	if (err <= 0 || err >= (int)sizeof(info->fw_version))
		nicif_err(nic_dev, drv, netdev,
			  "Failed snprintf fw_version, function return(%d) and dest_len(%d)\n",
			  err, (int)sizeof(info->fw_version));
}

static u32 hinic_get_msglevel(struct net_device *netdev)
@@ -1429,10 +1451,22 @@ static int __hinic_set_coalesce(struct net_device *netdev,

	if (queue == COALESCE_ALL_QUEUE) {
		ori_intr_coal = &nic_dev->intr_coalesce[0];
		snprintf(obj_str, sizeof(obj_str), "for netdev");
		err = snprintf(obj_str, sizeof(obj_str), "for netdev");
		if (err <= 0 || err >= OBJ_STR_MAX_LEN) {
			nicif_err(nic_dev, drv, netdev,
				  "Failed snprintf string, function return(%d) and dest_len(%d)\n",
				  err, OBJ_STR_MAX_LEN);
			return -EFAULT;
		}
	} else {
		ori_intr_coal = &nic_dev->intr_coalesce[queue];
		snprintf(obj_str, sizeof(obj_str), "for queue %d", queue);
		err = snprintf(obj_str, sizeof(obj_str), "for queue %d", queue);
		if (err <= 0 || err >= OBJ_STR_MAX_LEN) {
			nicif_err(nic_dev, drv, netdev,
				  "Failed snprintf string, function return(%d) and dest_len(%d)\n",
				  err, OBJ_STR_MAX_LEN);
			return -EFAULT;
		}
	}
	CHECK_COALESCE_CHANGED(coal, rx_coalesce_usecs, COALESCE_TIMER_CFG_UNIT,
			       ori_intr_coal->coalesce_timer_cfg, obj_str);
+39 −14
Original line number Diff line number Diff line
@@ -519,6 +519,9 @@ static inline void __set_heartbeat_ehd_detect_delay(struct hinic_hwdev *hwdev,
#define HINIC_QUEUE_MAX_DEPTH		12
#define HINIC_MAX_RX_BUFFER_SIZE	15

#define CAP_INFO_MAC_LEN		512
#define VENDOR_MAX_LEN			17

static bool check_root_ctxt(struct hinic_hwdev *hwdev, u16 func_idx,
			    void *buf_in, u16 in_size)
{
@@ -3891,6 +3894,7 @@ static void __print_cable_info(struct hinic_hwdev *hwdev,
	char tmp_vendor[17] = {0};
	char *port_type = "Unknown port type";
	int i;
	int err = 0;

	if (info->cable_absent) {
		sdk_info(hwdev->dev_hdl, "Cable unpresent\n");
@@ -3918,25 +3922,46 @@ static void __print_cable_info(struct hinic_hwdev *hwdev,

	memcpy(tmp_vendor, info->vendor_name,
	       sizeof(info->vendor_name));
	snprintf(tmp_str, sizeof(tmp_str) - 1,
	err = snprintf(tmp_str, sizeof(tmp_str),
		       "Vendor: %s, %s, length: %um, max_speed: %uGbps",
		       tmp_vendor, port_type, info->cable_length,
		       info->cable_max_speed);
	if (err <= 0 || err >= CAP_INFO_MAC_LEN) {
		sdk_err(hwdev->dev_hdl,
			"Failed snprintf cable vendor info, function return(%d) and dest_len(%d)\n",
			err, CAP_INFO_MAC_LEN);
		return;
	}

	if (info->port_type == LINK_PORT_FIBRE ||
	    info->port_type == LINK_PORT_AOC) {
		snprintf(tmp_str, sizeof(tmp_str) - 1,
		err = snprintf(tmp_str, sizeof(tmp_str),
			       "%s, %s, Temperature: %u", tmp_str,
			 info->sfp_type ? "SFP" : "QSFP", info->cable_temp);
			       info->sfp_type ? "SFP" : "QSFP",
			       info->cable_temp);
		if (err <= 0 || err >= CAP_INFO_MAC_LEN) {
			sdk_err(hwdev->dev_hdl,
				"Failed snprintf cable Temp, function return(%d) and dest_len(%d)\n",
				err, CAP_INFO_MAC_LEN);
			return;
		}

		if (info->sfp_type) {
			snprintf(tmp_str, sizeof(tmp_str) - 1,
			err = snprintf(tmp_str, sizeof(tmp_str),
				       "%s, rx power: %uuW, tx power: %uuW",
				       tmp_str, info->power[0], info->power[1]);
		} else {
			snprintf(tmp_str, sizeof(tmp_str) - 1,
			err = snprintf(tmp_str, sizeof(tmp_str),
				       "%s, rx power: %uuw %uuW %uuW %uuW",
				       tmp_str, info->power[0], info->power[1],
				       info->power[2], info->power[3]);
		}
		if (err <= 0 || err >= CAP_INFO_MAC_LEN) {
			sdk_err(hwdev->dev_hdl,
				"Failed snprintf power info, function return(%d) and dest_len(%d)\n",
				err, CAP_INFO_MAC_LEN);
			return;
		}
	}

	sdk_info(hwdev->dev_hdl, "Cable information: %s\n",
+36 −12
Original line number Diff line number Diff line
@@ -629,6 +629,7 @@ static void hinic_ignore_minor_version(char *version)
{
	char ver_split[MAX_VER_SPLIT_NUM][MAX_VER_FIELD_LEN] = { {0} };
	int max_ver_len, split_num = 0;
	int err;

	__version_split(version, &split_num, ver_split);
	if (split_num != MAX_VER_SPLIT_NUM)
@@ -637,8 +638,11 @@ static void hinic_ignore_minor_version(char *version)
	max_ver_len = (int)strlen(version) + 1;
	memset(version, 0, max_ver_len);

	snprintf(version, max_ver_len, "%s.%s.%s.0",
	err = snprintf(version, max_ver_len, "%s.%s.%s.0",
		       ver_split[0], ver_split[1], ver_split[2]);
	if (err <= 0 || err >= max_ver_len)
		pr_err("Failed snprintf version, function return(%d) and dest_len(%d)\n",
		       err, max_ver_len);
}

static int hinic_detect_version_compatible(struct hinic_pcidev *pcidev)
@@ -1152,7 +1156,7 @@ void hinic_get_all_chip_id(void *id_info)
	lld_dev_hold();
	list_for_each_entry(chip_node, &g_hinic_chip_list, node) {
		err = sscanf(chip_node->chip_name, HINIC_CHIP_NAME "%d", &id);
		if (err < 0)
		if (err <= 0)
			pr_err("Failed to get hinic id\n");

		card_id->id[i] = id;
@@ -1895,6 +1899,7 @@ static int alloc_chip_node(struct hinic_pcidev *pci_adapter)
	struct card_node *chip_node;
	unsigned char i;
	unsigned char parent_bus_number = 0;
	int err;

	if  (!pci_is_root_bus(pci_adapter->pcidev->bus))
		parent_bus_number = pci_adapter->pcidev->bus->parent->number;
@@ -1931,27 +1936,39 @@ static int alloc_chip_node(struct hinic_pcidev *pci_adapter)

	chip_node = kzalloc(sizeof(*chip_node), GFP_KERNEL);
	if (!chip_node) {
		card_bit_map = CLEAR_BIT(card_bit_map, i);
		sdk_err(&pci_adapter->pcidev->dev,
			"Failed to alloc chip node\n");
		return -ENOMEM;
		goto alloc_chip_err;
	}

	chip_node->dbgtool_attr_file.name = kzalloc(IFNAMSIZ, GFP_KERNEL);
	if (!(chip_node->dbgtool_attr_file.name)) {
		kfree(chip_node);
		card_bit_map = CLEAR_BIT(card_bit_map, i);
		sdk_err(&pci_adapter->pcidev->dev,
			"Failed to alloc dbgtool attr file name\n");
		return -ENOMEM;
		goto alloc_dbgtool_attr_file_err;
	}

	/* parent bus number */
	chip_node->dp_bus_num = parent_bus_number;

	snprintf(chip_node->chip_name, IFNAMSIZ, "%s%d", HINIC_CHIP_NAME, i);
	snprintf((char *)chip_node->dbgtool_attr_file.name,
	err = snprintf(chip_node->chip_name, IFNAMSIZ, "%s%d",
		       HINIC_CHIP_NAME, i);
	if (err <= 0 || err >= IFNAMSIZ) {
		sdk_err(&pci_adapter->pcidev->dev,
			"Failed snprintf chip_name, function return(%d) and dest_len(%d)\n",
			err, IFNAMSIZ);
		goto alloc_dbgtool_attr_file_err;
	}

	err = snprintf((char *)chip_node->dbgtool_attr_file.name,
		       IFNAMSIZ, "%s%d", HINIC_CHIP_NAME, i);
	if (err <= 0 || err >= IFNAMSIZ) {
		sdk_err(&pci_adapter->pcidev->dev,
			"Failed snprintf dbgtool_attr_file_name, function return(%d) and dest_len(%d)\n",
			err, IFNAMSIZ);
		goto alloc_dbgtool_attr_file_err;
	}

	sdk_info(&pci_adapter->pcidev->dev,
		 "Add new chip %s to global list succeed\n",
		 chip_node->chip_name);
@@ -1962,6 +1979,13 @@ static int alloc_chip_node(struct hinic_pcidev *pci_adapter)
	pci_adapter->chip_node = chip_node;

	return 0;

alloc_dbgtool_attr_file_err:
	kfree(chip_node);

alloc_chip_err:
	card_bit_map = CLEAR_BIT(card_bit_map, i);
	return -ENOMEM;
}

static void free_chip_node(struct hinic_pcidev *pci_adapter)
@@ -1976,7 +2000,7 @@ static void free_chip_node(struct hinic_pcidev *pci_adapter)
			 "Delete chip %s from global list succeed\n",
			 chip_node->chip_name);
		err = sscanf(chip_node->chip_name, HINIC_CHIP_NAME "%u", &id);
		if (err < 0)
		if (err <= 0)
			sdk_err(&pci_adapter->pcidev->dev, "Failed to get hinic id\n");

		card_bit_map = CLEAR_BIT(card_bit_map, id);
Loading