dpll: Fix potential msg memleak when genlmsg_put_reply failed
authorHao Ge <gehao@kylinos.cn>
Tue, 21 Nov 2023 01:37:09 +0000 (09:37 +0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 22 Nov 2023 01:41:20 +0000 (17:41 -0800)
We should clean the skb resource if genlmsg_put_reply failed.

Fixes: 9d71b54b65b1 ("dpll: netlink: Add DPLL framework base functions")
Signed-off-by: Hao Ge <gehao@kylinos.cn>
Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Link: https://lore.kernel.org/r/20231121013709.73323-1-gehao@kylinos.cn
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/dpll/dpll_netlink.c

index a6dc3997bf5c50cfbe4dd23d0836ed0f29b00fbd..442a0ebeb953e983d053d4c70d919e3a8aee213e 100644 (file)
@@ -1093,9 +1093,10 @@ int dpll_nl_pin_id_get_doit(struct sk_buff *skb, struct genl_info *info)
                return -ENOMEM;
        hdr = genlmsg_put_reply(msg, info, &dpll_nl_family, 0,
                                DPLL_CMD_PIN_ID_GET);
-       if (!hdr)
+       if (!hdr) {
+               nlmsg_free(msg);
                return -EMSGSIZE;
-
+       }
        pin = dpll_pin_find_from_nlattr(info);
        if (!IS_ERR(pin)) {
                ret = dpll_msg_add_pin_handle(msg, pin);
@@ -1123,8 +1124,10 @@ int dpll_nl_pin_get_doit(struct sk_buff *skb, struct genl_info *info)
                return -ENOMEM;
        hdr = genlmsg_put_reply(msg, info, &dpll_nl_family, 0,
                                DPLL_CMD_PIN_GET);
-       if (!hdr)
+       if (!hdr) {
+               nlmsg_free(msg);
                return -EMSGSIZE;
+       }
        ret = dpll_cmd_pin_get_one(msg, pin, info->extack);
        if (ret) {
                nlmsg_free(msg);
@@ -1256,8 +1259,10 @@ int dpll_nl_device_id_get_doit(struct sk_buff *skb, struct genl_info *info)
                return -ENOMEM;
        hdr = genlmsg_put_reply(msg, info, &dpll_nl_family, 0,
                                DPLL_CMD_DEVICE_ID_GET);
-       if (!hdr)
+       if (!hdr) {
+               nlmsg_free(msg);
                return -EMSGSIZE;
+       }
 
        dpll = dpll_device_find_from_nlattr(info);
        if (!IS_ERR(dpll)) {
@@ -1284,8 +1289,10 @@ int dpll_nl_device_get_doit(struct sk_buff *skb, struct genl_info *info)
                return -ENOMEM;
        hdr = genlmsg_put_reply(msg, info, &dpll_nl_family, 0,
                                DPLL_CMD_DEVICE_GET);
-       if (!hdr)
+       if (!hdr) {
+               nlmsg_free(msg);
                return -EMSGSIZE;
+       }
 
        ret = dpll_device_get_one(dpll, msg, info->extack);
        if (ret) {