Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/106850/?format=api
https://patches.dpdk.org/api/patches/106850/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/patch/tencent_E5A71311F53AF6DFEB237C22DE31E23C2008@qq.com/", "project": { "id": 1, "url": "https://patches.dpdk.org/api/projects/1/?format=api", "name": "DPDK", "link_name": "dpdk", "list_id": "dev.dpdk.org", "list_email": "dev@dpdk.org", "web_url": "http://core.dpdk.org", "scm_url": "git://dpdk.org/dpdk", "webscm_url": "http://git.dpdk.org/dpdk", "list_archive_url": "https://inbox.dpdk.org/dev", "list_archive_url_format": "https://inbox.dpdk.org/dev/{}", "commit_url_format": "" }, "msgid": "<tencent_E5A71311F53AF6DFEB237C22DE31E23C2008@qq.com>", "list_archive_url": "https://inbox.dpdk.org/dev/tencent_E5A71311F53AF6DFEB237C22DE31E23C2008@qq.com", "date": "2022-02-04T07:49:34", "name": "[v5] eventdev/eth_rx: fix memory leak when token parsing finished", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "1b35a1c227f839b24e5e75ee6b8327d921301b86", "submitter": { "id": 2458, "url": "https://patches.dpdk.org/api/people/2458/?format=api", "name": "Weiguo Li", "email": "liwg06@foxmail.com" }, "delegate": null, "mbox": "https://patches.dpdk.org/project/dpdk/patch/tencent_E5A71311F53AF6DFEB237C22DE31E23C2008@qq.com/mbox/", "series": [ { "id": 21463, "url": "https://patches.dpdk.org/api/series/21463/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=21463", "date": "2022-02-04T07:49:34", "name": "[v5] eventdev/eth_rx: fix memory leak when token parsing finished", "version": 5, "mbox": "https://patches.dpdk.org/series/21463/mbox/" } ], "comments": "https://patches.dpdk.org/api/patches/106850/comments/", "check": "warning", "checks": "https://patches.dpdk.org/api/patches/106850/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<dev-bounces@dpdk.org>", "X-Original-To": "patchwork@inbox.dpdk.org", "Delivered-To": "patchwork@inbox.dpdk.org", "Received": [ "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 56B20A00C3;\n\tFri, 4 Feb 2022 08:49:42 +0100 (CET)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 2EC8440143;\n\tFri, 4 Feb 2022 08:49:42 +0100 (CET)", "from out162-62-57-210.mail.qq.com (out162-62-57-210.mail.qq.com\n [162.62.57.210]) by mails.dpdk.org (Postfix) with ESMTP id A2A2B40140\n for <dev@dpdk.org>; Fri, 4 Feb 2022 08:49:40 +0100 (CET)", "from liwg-ubuntu.lan ([111.193.130.237])\n by newxmesmtplogicsvrszc11.qq.com (NewEsmtp) with SMTP\n id C6285A06; Fri, 04 Feb 2022 15:49:34 +0800" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com;\n s=s201512; t=1643960978;\n bh=JdmOZ3NJueUGvbOUVfnA0TJDvTa10+oKscHvNIqfm44=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References;\n b=Q8IHWDLguV10MPdW8R31q6F0bmKaNtPu5ZblqIHvJftO6oeRFqbfhwPHImslMPNyd\n m5zG5mPK/nH3X1D1q4pri8e3M52r5HmFVdJbzP3LcOPLLZt/vks55z/GrPXUpbmKpp\n Q7lovHkCnDQ1yApT4buVhmFSsQYldVO6v9qNoSLU=", "X-QQ-mid": "xmsmtpt1643960974tfe4qqinq", "Message-ID": "<tencent_E5A71311F53AF6DFEB237C22DE31E23C2008@qq.com>", "X-QQ-XMAILINFO": "M5KKvM8FjyDpJFSTKssTu0kjGiqnQlF1Od43d0GQlbdLnvLsBFEp3F7Err55m0\n fbgg9n/qgHLgLfrBPK/zIRk283M+vKmwQ9Q4eISx0Wq+na+QtVhxcwyzO48dg7HpQgxnAx7yBxRp\n pijPbVl9kwL8S1pKPvPdeT39E8C34tTxvaUalpUAT8f0TDCdxwZOq57g605mTgSIZYOgNkJF2r8g\n 7i3sNL0E9X+86ldF/JPKPRyXeCYR8+HtueApF7nR1dCql7P+X8ecpxJApDNorqkKwVGwa7X9qUsK\n 3slqiVuwL49j//H2HMqWSOcgmxxsS6rHvOAuLUE2TOC+e2rvDQceieZUOT5a1iFK6J1K/oX0Ge5/\n gZe67Nbv5KVklrSsq18oRfLJP7Pfey662jQS4HDZkhbnFu1FtyO4h7ZFecJV1/Tk9thdW3TomISQ\n jaPNxe9rgYzdALdZtIHdLlim3+nDB/O0NHOy3f56672AAFELfORj+9MKkStX0hsIwMhYDdi5O6dB\n QvnJ1YoR6/T4DEYErBD5MznfXgmabSZpURxOz6xQjJWeN9QJ7sTNDqHtebYmMMpkEflYNDTdpk5Y\n m+E/KyeSivk8pF+2Ti3EQTzxqLedDJfTGvwudJS5G0ad5yJsvvgMnjMMZR6qy+ohvCJQNTmde8gw\n S7FnGHJnWYpdQf7F+Uoh/goQ96/m0k9fGbAbPOba61EqNOTwTBkZ1m97gkLUUx79H1kXbsiExZdT\n ftmKL7C6PBN6CUDm4WB4H8SDABOqiGXvW1RdNwnITRGn7n1fZjRdS6KPCTMtmELxFhmOPcorfa7Y\n cR9YWhp5ySAvB0//kODio7SWtzP7vBH+3fU5hvIbZk0tcA0/uavNLq", "From": "Weiguo Li <liwg06@foxmail.com>", "To": "jay.jayatheerthan@intel.com", "Cc": "ganapati.kundapura@intel.com, s.v.naga.harish.k@intel.com,\n stephen@networkplumber.org, dev@dpdk.org", "Subject": "[PATCH v5] eventdev/eth_rx: fix memory leak when token parsing\n finished", "Date": "Fri, 4 Feb 2022 15:49:34 +0800", "X-OQ-MSGID": "<20220204074934.2169577-1-liwg06@foxmail.com>", "X-Mailer": "git-send-email 2.25.1", "In-Reply-To": "<tencent_A884E9987D2B8D608AF8C4E4F1209C4E440A@qq.com>", "References": "<tencent_A884E9987D2B8D608AF8C4E4F1209C4E440A@qq.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "DPDK patches and discussions <dev.dpdk.org>", "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>", "List-Archive": "<http://mails.dpdk.org/archives/dev/>", "List-Post": "<mailto:dev@dpdk.org>", "List-Help": "<mailto:dev-request@dpdk.org?subject=help>", "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org" }, "content": "The memory get from strdup should be freed when parameter parsing\nfinished, and also should be freed when error occurs.\n\nFixes: 814d01709328 (\"eventdev/eth_rx: support telemetry\")\nFixes: 9e583185318f (\"eventdev/eth_rx: support telemetry\")\n\nSigned-off-by: Weiguo Li <liwg06@foxmail.com>\nAcked-by: Ganapati Kundapura<ganapati.kundapura@intel.com>\n\n---\nv5:\n* fix according to Jay's comment.\n* fix anothor bypassing the freeing of memory problem\nv4:\n* fix compilation issue\nv3:\n* validate \"eth_dev_id\" by rte_eth_dev_is_valid_port()\n as Ganapati's comment.\n* validate \"token\" by macros to reduce code redundancy.\n* use new macros to avoid bypassing the freeing of memory problem.\nv2:\n* add memory check after strdup\n---\n lib/eventdev/rte_event_eth_rx_adapter.c | 105 ++++++++++++++++++------\n 1 file changed, 78 insertions(+), 27 deletions(-)", "diff": "diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c b/lib/eventdev/rte_event_eth_rx_adapter.c\nindex ae1e260c08..719ef520cd 100644\n--- a/lib/eventdev/rte_event_eth_rx_adapter.c\n+++ b/lib/eventdev/rte_event_eth_rx_adapter.c\n@@ -293,6 +293,30 @@ rxa_event_buf_get(struct event_eth_rx_adapter *rx_adapter, uint16_t eth_dev_id,\n \t} \\\n } while (0)\n \n+#define RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_GOTO_ERR_RET(id, retval) do { \\\n+\tif (!rxa_validate_id(id)) { \\\n+\t\tRTE_EDEV_LOG_ERR(\"Invalid eth Rx adapter id = %d\\n\", id); \\\n+\t\tret = retval; \\\n+\t\tgoto error; \\\n+\t} \\\n+} while (0)\n+\n+#define RTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, retval) do { \\\n+\tif ((token) == NULL || strlen(token) == 0 || !isdigit(*token)) { \\\n+\t\tRTE_EDEV_LOG_ERR(\"Invalid eth Rx adapter token\\n\"); \\\n+\t\tret = retval; \\\n+\t\tgoto error; \\\n+\t} \\\n+} while (0)\n+\n+#define RTE_ETH_VALID_PORTID_OR_GOTO_ERR_RET(port_id, retval) do { \\\n+\tif (!rte_eth_dev_is_valid_port(port_id)) { \\\n+\t\tRTE_ETHDEV_LOG(ERR, \"Invalid port_id=%u\\n\", port_id); \\\n+\t\tret = retval; \\\n+\t\tgoto error; \\\n+\t} \\\n+} while (0)\n+\n static inline int\n rxa_sw_adapter_queue_count(struct event_eth_rx_adapter *rx_adapter)\n {\n@@ -3323,7 +3347,7 @@ handle_rxa_get_queue_conf(const char *cmd __rte_unused,\n {\n \tuint8_t rx_adapter_id;\n \tuint16_t rx_queue_id;\n-\tint eth_dev_id;\n+\tint eth_dev_id, ret = -1;\n \tchar *token, *l_params;\n \tstruct rte_event_eth_rx_adapter_queue_conf queue_conf;\n \n@@ -3332,38 +3356,43 @@ handle_rxa_get_queue_conf(const char *cmd __rte_unused,\n \n \t/* Get Rx adapter ID from parameter string */\n \tl_params = strdup(params);\n+\tif (l_params == NULL)\n+\t\treturn -ENOMEM;\n \ttoken = strtok(l_params, \",\");\n+\tRTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1);\n \trx_adapter_id = strtoul(token, NULL, 10);\n-\tRTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(rx_adapter_id, -EINVAL);\n+\tRTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_GOTO_ERR_RET(rx_adapter_id, -EINVAL);\n \n \ttoken = strtok(NULL, \",\");\n-\tif (token == NULL || strlen(token) == 0 || !isdigit(*token))\n-\t\treturn -1;\n+\tRTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1);\n \n \t/* Get device ID from parameter string */\n \teth_dev_id = strtoul(token, NULL, 10);\n-\tRTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(eth_dev_id, -EINVAL);\n+\tRTE_ETH_VALID_PORTID_OR_GOTO_ERR_RET(eth_dev_id, -EINVAL);\n \n \ttoken = strtok(NULL, \",\");\n-\tif (token == NULL || strlen(token) == 0 || !isdigit(*token))\n-\t\treturn -1;\n+\tRTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1);\n \n \t/* Get Rx queue ID from parameter string */\n \trx_queue_id = strtoul(token, NULL, 10);\n \tif (rx_queue_id >= rte_eth_devices[eth_dev_id].data->nb_rx_queues) {\n \t\tRTE_EDEV_LOG_ERR(\"Invalid rx queue_id %u\", rx_queue_id);\n-\t\treturn -EINVAL;\n+\t\tret = -EINVAL;\n+\t\tgoto error;\n \t}\n \n \ttoken = strtok(NULL, \"\\0\");\n \tif (token != NULL)\n \t\tRTE_EDEV_LOG_ERR(\"Extra parameters passed to eventdev\"\n \t\t\t\t \" telemetry command, ignoring\");\n+\t/* Parsing parameter finished */\n+\tfree(l_params);\n \n \tif (rte_event_eth_rx_adapter_queue_conf_get(rx_adapter_id, eth_dev_id,\n \t\t\t\t\t\t rx_queue_id, &queue_conf)) {\n \t\tRTE_EDEV_LOG_ERR(\"Failed to get Rx adapter queue config\");\n-\t\treturn -1;\n+\t\tret = -1;\n+\t\tgoto error;\n \t}\n \n \trte_tel_data_start_dict(d);\n@@ -3378,6 +3407,10 @@ handle_rxa_get_queue_conf(const char *cmd __rte_unused,\n \tRXA_ADD_DICT(queue_conf.ev, flow_id);\n \n \treturn 0;\n+\n+error:\n+\tfree(l_params);\n+\treturn ret;\n }\n \n static int\n@@ -3387,7 +3420,7 @@ handle_rxa_get_queue_stats(const char *cmd __rte_unused,\n {\n \tuint8_t rx_adapter_id;\n \tuint16_t rx_queue_id;\n-\tint eth_dev_id;\n+\tint eth_dev_id, ret = -1;\n \tchar *token, *l_params;\n \tstruct rte_event_eth_rx_adapter_queue_stats q_stats;\n \n@@ -3396,38 +3429,43 @@ handle_rxa_get_queue_stats(const char *cmd __rte_unused,\n \n \t/* Get Rx adapter ID from parameter string */\n \tl_params = strdup(params);\n+\tif (l_params == NULL)\n+\t\treturn -ENOMEM;\n \ttoken = strtok(l_params, \",\");\n+\tRTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1);\n \trx_adapter_id = strtoul(token, NULL, 10);\n-\tRTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(rx_adapter_id, -EINVAL);\n+\tRTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_GOTO_ERR_RET(rx_adapter_id, -EINVAL);\n \n \ttoken = strtok(NULL, \",\");\n-\tif (token == NULL || strlen(token) == 0 || !isdigit(*token))\n-\t\treturn -1;\n+\tRTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1);\n \n \t/* Get device ID from parameter string */\n \teth_dev_id = strtoul(token, NULL, 10);\n-\tRTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(eth_dev_id, -EINVAL);\n+\tRTE_ETH_VALID_PORTID_OR_GOTO_ERR_RET(eth_dev_id, -EINVAL);\n \n \ttoken = strtok(NULL, \",\");\n-\tif (token == NULL || strlen(token) == 0 || !isdigit(*token))\n-\t\treturn -1;\n+\tRTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1);\n \n \t/* Get Rx queue ID from parameter string */\n \trx_queue_id = strtoul(token, NULL, 10);\n \tif (rx_queue_id >= rte_eth_devices[eth_dev_id].data->nb_rx_queues) {\n \t\tRTE_EDEV_LOG_ERR(\"Invalid rx queue_id %u\", rx_queue_id);\n-\t\treturn -EINVAL;\n+\t\tret = -EINVAL;\n+\t\tgoto error;\n \t}\n \n \ttoken = strtok(NULL, \"\\0\");\n \tif (token != NULL)\n \t\tRTE_EDEV_LOG_ERR(\"Extra parameters passed to eventdev\"\n \t\t\t\t \" telemetry command, ignoring\");\n+\t/* Parsing parameter finished */\n+\tfree(l_params);\n \n \tif (rte_event_eth_rx_adapter_queue_stats_get(rx_adapter_id, eth_dev_id,\n \t\t\t\t\t\t rx_queue_id, &q_stats)) {\n \t\tRTE_EDEV_LOG_ERR(\"Failed to get Rx adapter queue stats\");\n-\t\treturn -1;\n+\t\tret = -1;\n+\t\tgoto error;\n \t}\n \n \trte_tel_data_start_dict(d);\n@@ -3441,6 +3479,10 @@ handle_rxa_get_queue_stats(const char *cmd __rte_unused,\n \tRXA_ADD_DICT(q_stats, rx_dropped);\n \n \treturn 0;\n+\n+error:\n+\tfree(l_params);\n+\treturn ret;\n }\n \n static int\n@@ -3450,7 +3492,7 @@ handle_rxa_queue_stats_reset(const char *cmd __rte_unused,\n {\n \tuint8_t rx_adapter_id;\n \tuint16_t rx_queue_id;\n-\tint eth_dev_id;\n+\tint eth_dev_id, ret = -1;\n \tchar *token, *l_params;\n \n \tif (params == NULL || strlen(params) == 0 || !isdigit(*params))\n@@ -3458,42 +3500,51 @@ handle_rxa_queue_stats_reset(const char *cmd __rte_unused,\n \n \t/* Get Rx adapter ID from parameter string */\n \tl_params = strdup(params);\n+\tif (l_params == NULL)\n+\t\treturn -ENOMEM;\n \ttoken = strtok(l_params, \",\");\n+\tRTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1);\n \trx_adapter_id = strtoul(token, NULL, 10);\n-\tRTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(rx_adapter_id, -EINVAL);\n+\tRTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_GOTO_ERR_RET(rx_adapter_id, -EINVAL);\n \n \ttoken = strtok(NULL, \",\");\n-\tif (token == NULL || strlen(token) == 0 || !isdigit(*token))\n-\t\treturn -1;\n+\tRTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1);\n \n \t/* Get device ID from parameter string */\n \teth_dev_id = strtoul(token, NULL, 10);\n-\tRTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(eth_dev_id, -EINVAL);\n+\tRTE_ETH_VALID_PORTID_OR_GOTO_ERR_RET(eth_dev_id, -EINVAL);\n \n \ttoken = strtok(NULL, \",\");\n-\tif (token == NULL || strlen(token) == 0 || !isdigit(*token))\n-\t\treturn -1;\n+\tRTE_EVENT_ETH_RX_ADAPTER_TOKEN_VALID_OR_GOTO_ERR_RET(token, -1);\n \n \t/* Get Rx queue ID from parameter string */\n \trx_queue_id = strtoul(token, NULL, 10);\n \tif (rx_queue_id >= rte_eth_devices[eth_dev_id].data->nb_rx_queues) {\n \t\tRTE_EDEV_LOG_ERR(\"Invalid rx queue_id %u\", rx_queue_id);\n-\t\treturn -EINVAL;\n+\t\tret = -EINVAL;\n+\t\tgoto error;\n \t}\n \n \ttoken = strtok(NULL, \"\\0\");\n \tif (token != NULL)\n \t\tRTE_EDEV_LOG_ERR(\"Extra parameters passed to eventdev\"\n \t\t\t\t \" telemetry command, ignoring\");\n+\t/* Parsing parameter finished */\n+\tfree(l_params);\n \n \tif (rte_event_eth_rx_adapter_queue_stats_reset(rx_adapter_id,\n \t\t\t\t\t\t eth_dev_id,\n \t\t\t\t\t\t rx_queue_id)) {\n \t\tRTE_EDEV_LOG_ERR(\"Failed to reset Rx adapter queue stats\");\n-\t\treturn -1;\n+\t\tret = -1;\n+\t\tgoto error;\n \t}\n \n \treturn 0;\n+\n+error:\n+\tfree(l_params);\n+\treturn ret;\n }\n \n RTE_INIT(rxa_init_telemetry)\n", "prefixes": [ "v5" ] }{ "id": 106850, "url": "