From: Ye Xiaolong <xiaolong.ye@intel.com>
To: "Zhao1, Wei" <wei.zhao1@intel.com>
Cc: "Guo, Jia" <jia.guo@intel.com>, "dev@dpdk.org" <dev@dpdk.org>,
"stable@dpdk.org" <stable@dpdk.org>,
"Xing, Beilei" <beilei.xing@intel.com>
Subject: Re: [dpdk-dev] [PATCH] net/i40e: fix the security risk of wild pointer operation
Date: Mon, 18 May 2020 13:32:10 +0800 [thread overview]
Message-ID: <20200518053209.GC93932@intel.com> (raw)
In-Reply-To: <MWHPR11MB13914F2D05C4A7AD116D10EFB7B80@MWHPR11MB1391.namprd11.prod.outlook.com>
Hi, Wei
On 05/18, Zhao1, Wei wrote:
>HI, Xiaolong & guojia
>
>> -----Original Message-----
>> From: Ye, Xiaolong <xiaolong.ye@intel.com>
>> Sent: Friday, May 15, 2020 3:28 PM
>> To: Guo, Jia <jia.guo@intel.com>
>> Cc: Zhao1, Wei <wei.zhao1@intel.com>; dev@dpdk.org; stable@dpdk.org;
>> Xing, Beilei <beilei.xing@intel.com>
>> Subject: Re: [dpdk-dev] [PATCH] net/i40e: fix the security risk of wild pointer
>> operation
>>
>> On 05/15, Jeff Guo wrote:
>> >hi, zhaowei
>> >
>> >On 5/12/2020 11:19 PM, Wei Zhao wrote:
>> >> In i40e PMD code of function i40e_res_pool_free(), if valid_entry is
>> >> freed by "rte_free(valid_entry);" in the following code:
>> >>
>> >> if (prev != NULL) {
>> >> ........................
>> >>
>> >> if (insert == 1) {
>> >> LIST_REMOVE(valid_entry, next);
>> >> rte_free(valid_entry);
>> >> } else {
>> >> rte_free(valid_entry);
>> >> insert = 1;
>> >> }
>> >> }
>> >>
>> >> then the following code for pool update may still use the wild
>> >> pointer
>> >> "valid_entry":
>> >>
>> >> " pool->num_free += valid_entry->len;
>> >> pool->num_alloc -= valid_entry>len; "
>> >> it seems to be a security bug, we should avoid this risk.
>> >>
>> >> Cc: stable@dpdk.org
>> >> Fixes: 4861cde46116 ("i40e: new poll mode driver")
>> >>
>> >> Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
>> >> ---
>> >> drivers/net/i40e/i40e_ethdev.c | 6 +++---
>> >> 1 file changed, 3 insertions(+), 3 deletions(-)
>> >>
>> >> diff --git a/drivers/net/i40e/i40e_ethdev.c
>> >> b/drivers/net/i40e/i40e_ethdev.c index 749d85f54..7f8ea5309 100644
>> >> --- a/drivers/net/i40e/i40e_ethdev.c
>> >> +++ b/drivers/net/i40e/i40e_ethdev.c
>> >> @@ -4973,6 +4973,9 @@ i40e_res_pool_free(struct i40e_res_pool_info
>> *pool,
>> >> }
>> >> insert = 0;
>> >> +pool->num_free += valid_entry->len;
>> >> +pool->num_alloc -= valid_entry->len;
>> >> +
>> >
>> >
>> >Shouldn't the pool count update after the pool->free_list updated by
>> >"LIST_INSERT_HEAD(&pool->free_list, valid_entry, next)"?
>> >
>> >If so, you could use a variable to restore valid_entry->len at the
>> >begin and use it update pool count and other place.
>>
>> Either way works from function point of view, but I do agree with Jeff that uses
>> local variable to store the valid_entry->len at the beginning, and then updates
>> the pool->num_free/num_alloc at the end.
>>
>> Also I think it needs to set valid_entry to NULL after free it, it can avoid wild
>> pointer case like this, if there is dereference of this pointer after setting it to
>> NULL, program would crash directly and we can solve it early.
>>
>> Thanks,
>> Xiaolong
>
>We must update it after find the proper one in the pool->free_list at once, if we use a local pointer to store it,
>The proper entry may has been freed in the following code, and merge with other free resource prev or next.
I think Jia's point is to store the valid_entry->len to a local var, not use
a local pointer to store valid_entry.
And please set valid_entry to NULL after free in the new version.
Thanks,
Xiaolong
>
>
>>
>> >
>> >
>> >> /* Try to merge with next one*/
>> >> if (next != NULL) {
>> >> /* Merge with next one */
>> >> @@ -5010,9 +5013,6 @@ i40e_res_pool_free(struct i40e_res_pool_info
>> *pool,
>> >> LIST_INSERT_HEAD(&pool->free_list, valid_entry, next);
>> >> }
>> >> -pool->num_free += valid_entry->len;
>> >> -pool->num_alloc -= valid_entry->len;
>> >> -
>> >> return 0;
>> >> }
next prev parent reply other threads:[~2020-05-18 5:40 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-12 15:19 [dpdk-dev] [PATCH] net/i40e: fix the security risk of wild pointer operation Wei Zhao
2020-05-15 2:24 ` Zhao1, Wei
2020-05-15 6:32 ` Jeff Guo
2020-05-15 7:28 ` Ye Xiaolong
2020-05-18 5:24 ` Zhao1, Wei
2020-05-18 5:32 ` Ye Xiaolong [this message]
2020-05-18 5:10 ` [dpdk-dev] [PATCH v2] net/i40e: fix the core dump " Wei Zhao
2020-05-18 6:43 ` [dpdk-dev] [PATCH v3] " Wei Zhao
2020-05-18 7:43 ` [dpdk-dev] [PATCH v4] " Wei Zhao
2020-05-18 8:00 ` [dpdk-dev] [PATCH v5] " Wei Zhao
2020-05-18 8:45 ` Jeff Guo
2020-05-19 1:28 ` Ye Xiaolong
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=20200518053209.GC93932@intel.com \
--to=xiaolong.ye@intel.com \
--cc=beilei.xing@intel.com \
--cc=dev@dpdk.org \
--cc=jia.guo@intel.com \
--cc=stable@dpdk.org \
--cc=wei.zhao1@intel.com \
/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.