get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/106850/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 106850,
    "url": "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"
    ]
}