usage of cleanup attributes is discouraged in net [1], achieve cleanup using goto. In this patch though, only uninitialized pointers with __free attribute are cleaned as they can cause undefined behavior when they go out of scope Suggested-by: Simon Horman Reported-by: Dan Carpenter Closes: https://lore.kernel.org/all/aPiG_F5EBQUjZqsl@stanley.mountain/ Signed-off-by: Ally Heev [1] https://docs.kernel.org/process/maintainer-netdev.html#using-device-managed-and-cleanup-h-constructs Signed-off-by: Ally Heev --- drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 28 +++++++++++++++++-------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c index cbb5fa30f5a0ec778c1ee30470da3ca21cc1af24..5b2bf8c3205bc1ea0746f78afa2a24f3f8ad2a8c 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c +++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c @@ -1012,7 +1012,7 @@ static int idpf_send_get_caps_msg(struct idpf_adapter *adapter) */ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter) { - struct virtchnl2_get_lan_memory_regions *rcvd_regions __free(kfree); + struct virtchnl2_get_lan_memory_regions *rcvd_regions = NULL; struct idpf_vc_xn_params xn_params = { .vc_op = VIRTCHNL2_OP_GET_LAN_MEMORY_REGIONS, .recv_buf.iov_len = IDPF_CTLQ_MAX_BUF_LEN, @@ -1029,21 +1029,29 @@ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter) xn_params.recv_buf.iov_base = rcvd_regions; reply_sz = idpf_vc_xn_exec(adapter, &xn_params); - if (reply_sz < 0) - return reply_sz; + if (reply_sz < 0) { + err = reply_sz; + goto out; + } num_regions = le16_to_cpu(rcvd_regions->num_memory_regions); size = struct_size(rcvd_regions, mem_reg, num_regions); - if (reply_sz < size) - return -EIO; + if (reply_sz < size) { + err = -EIO; + goto out; + } - if (size > IDPF_CTLQ_MAX_BUF_LEN) - return -EINVAL; + if (size > IDPF_CTLQ_MAX_BUF_LEN) { + err = -EINVAL; + goto out; + } hw = &adapter->hw; hw->lan_regs = kcalloc(num_regions, sizeof(*hw->lan_regs), GFP_KERNEL); - if (!hw->lan_regs) - return -ENOMEM; + if (!hw->lan_regs) { + err = -ENOMEM; + goto out; + } for (int i = 0; i < num_regions; i++) { hw->lan_regs[i].addr_len = @@ -1053,6 +1061,8 @@ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter) } hw->num_lan_regs = num_regions; +out: + kfree(rcvd_regions); return err; } -- 2.47.3