From: Leon Romanovsky <leon@kernel.org>
To: Dan Carpenter <error27@gmail.com>
Cc: faisal.latif@intel.com, linux-rdma@vger.kernel.org
Subject: Re: [bug report] iwpm: crash fix for large connections test
Date: Thu, 17 Nov 2022 11:24:38 +0200 [thread overview]
Message-ID: <Y3X91h5Fla+4mICY@unreal> (raw)
In-Reply-To: <Y3ORbHXv5M8X8kqN@kili>
On Tue, Nov 15, 2022 at 04:17:32PM +0300, Dan Carpenter wrote:
> [ This isn't really the correct patch to blame. Sorry! -dan ]
>
> Hello Faisal Latif,
>
> The patch dafb5587178a: "iwpm: crash fix for large connections test"
> from Feb 26, 2016, leads to the following Smatch static checker
> warning:
>
> drivers/infiniband/core/iwpm_msg.c:437 iwpm_register_pid_cb() warn: 'nlmsg_request' was already freed.
> drivers/infiniband/core/iwpm_msg.c:509 iwpm_add_mapping_cb() warn: 'nlmsg_request' was already freed.
> drivers/infiniband/core/iwpm_msg.c:607 iwpm_add_and_query_mapping_cb() warn: 'nlmsg_request' was already freed.
> drivers/infiniband/core/iwpm_msg.c:806 iwpm_mapping_error_cb() warn: 'nlmsg_request' was already freed.
>
> drivers/infiniband/core/iwpm_msg.c
> 385 int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb)
> 386 {
> 387 struct iwpm_nlmsg_request *nlmsg_request = NULL;
> 388 struct nlattr *nltb[IWPM_NLA_RREG_PID_MAX];
> 389 struct iwpm_dev_data *pm_msg;
> 390 char *dev_name, *iwpm_name;
> 391 u32 msg_seq;
> 392 u8 nl_client;
> 393 u16 iwpm_version;
> 394 const char *msg_type = "Register Pid response";
> 395
> 396 if (iwpm_parse_nlmsg(cb, IWPM_NLA_RREG_PID_MAX,
> 397 resp_reg_policy, nltb, msg_type))
> 398 return -EINVAL;
> 399
> 400 msg_seq = nla_get_u32(nltb[IWPM_NLA_RREG_PID_SEQ]);
> 401 nlmsg_request = iwpm_find_nlmsg_request(msg_seq);
> 402 if (!nlmsg_request) {
> 403 pr_info("%s: Could not find a matching request (seq = %u)\n",
> 404 __func__, msg_seq);
> 405 return -EINVAL;
> 406 }
> 407 pm_msg = nlmsg_request->req_buffer;
> 408 nl_client = nlmsg_request->nl_client;
> 409 dev_name = (char *)nla_data(nltb[IWPM_NLA_RREG_IBDEV_NAME]);
> 410 iwpm_name = (char *)nla_data(nltb[IWPM_NLA_RREG_ULIB_NAME]);
> 411 iwpm_version = nla_get_u16(nltb[IWPM_NLA_RREG_ULIB_VER]);
> 412
> 413 /* check device name, ulib name and version */
> 414 if (strcmp(pm_msg->dev_name, dev_name) ||
> 415 strcmp(iwpm_ulib_name, iwpm_name) ||
> 416 iwpm_version < IWPM_UABI_VERSION_MIN) {
> 417
> 418 pr_info("%s: Incorrect info (dev = %s name = %s version = %u)\n",
> 419 __func__, dev_name, iwpm_name, iwpm_version);
> 420 nlmsg_request->err_code = IWPM_USER_LIB_INFO_ERR;
> 421 goto register_pid_response_exit;
> 422 }
> 423 iwpm_user_pid = cb->nlh->nlmsg_pid;
> 424 iwpm_ulib_version = iwpm_version;
> 425 if (iwpm_ulib_version < IWPM_UABI_VERSION)
> 426 pr_warn_once("%s: Down level iwpmd/pid %d. Continuing...",
> 427 __func__, iwpm_user_pid);
> 428 atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq);
> 429 pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n",
> 430 __func__, iwpm_user_pid);
> 431 iwpm_set_registration(nl_client, IWPM_REG_VALID);
> 432 register_pid_response_exit:
> 433 nlmsg_request->request_done = 1;
> 434 /* always for found nlmsg_request */
> 435 kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request);
>
> The iwpm_free_nlmsg_request() function will free "nlmsg_request"...
> It's not clear what the "/* always for found nlmsg_request */" comment
> means. Maybe it means that the refcount won't drop to zero so the
> free function won't be called?
I think so. The nlmsg_request reference counter is elevated when it is
found in iwpm_find_nlmsg_request(). So I assume that it will be at least
2 before call to kref_put(). Most likely, nlmsg_request->sem prevents
from parallel threads to decrease that reference counter.
BTW, not IWPM expert.
Thanks
next prev parent reply other threads:[~2022-11-17 9:25 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-15 13:17 [bug report] iwpm: crash fix for large connections test Dan Carpenter
2022-11-17 9:24 ` Leon Romanovsky [this message]
2022-11-18 20:44 ` Ismail, Mustafa
2022-11-19 7:31 ` Dan Carpenter
2022-11-28 7:34 ` Dan Carpenter
2023-01-20 11:13 ` Greg Kroah-Hartman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y3X91h5Fla+4mICY@unreal \
--to=leon@kernel.org \
--cc=error27@gmail.com \
--cc=faisal.latif@intel.com \
--cc=linux-rdma@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.