[dpdk-dev] [PATCH v2 2/8] net/bnxt: fix to avoid a segfault
Stephen Hurd
stephen.hurd at broadcom.com
Fri Jul 21 21:09:22 CEST 2017
So the only change was replacing a nesting level with a continue? Yeah,
looks good.
On Thu, Jul 20, 2017 at 8:22 PM, Ajit Khaparde <ajit.khaparde at broadcom.com>
wrote:
> Fix use of local variable to avoid segfault.
> cnt was incorrectly tested and decremented in the loop that removes
> a VLAN from the table.
>
> Fixes: 36735a932ca7 ("support set VF QOS and MAC anti spoof")
>
> Signed-off-by: Stephen Hurd <stephen.hurd at broadcom.com>
> Signed-off-by: Ajit Khaparde <ajit.khaparde at broadcom.com>
>
> --
> v1->v2: incorporate review feedback.
> ---
> drivers/net/bnxt/rte_pmd_bnxt.c | 101 +++++++++++++++++++-----------
> ----------
> 1 file changed, 49 insertions(+), 52 deletions(-)
>
> diff --git a/drivers/net/bnxt/rte_pmd_bnxt.c b/drivers/net/bnxt/rte_pmd_
> bnxt.c
> index 0a8fb1e..ec5855d 100644
> --- a/drivers/net/bnxt/rte_pmd_bnxt.c
> +++ b/drivers/net/bnxt/rte_pmd_bnxt.c
> @@ -473,62 +473,59 @@ int rte_pmd_bnxt_set_vf_vlan_filter(uint8_t port,
> uint16_t vlan,
>
> for (i = 0; vf_mask; i++, vf_mask >>= 1) {
> cnt = bp->pf.vf_info[i].vlan_count;
> - if (vf_mask & 1) {
> - if (bp->pf.vf_info[i].vlan_table == NULL) {
> - rc = -1;
> - continue;
> + if ((vf_mask & 1) == 0)
> + continue;
> +
> + if (bp->pf.vf_info[i].vlan_table == NULL) {
> + rc = -1;
> + continue;
> + }
> + if (vlan_on) {
> + /* First, search for a duplicate... */
> + for (j = 0; j < cnt; j++) {
> + if (rte_be_to_cpu_16(
> + bp->pf.vf_info[i].vlan_table[j].vid)
> == vlan)
> + break;
> }
> - if (vlan_on) {
> - /* First, search for a duplicate... */
> - for (j = 0; j < cnt; j++) {
> - if (rte_be_to_cpu_16(
> - bp->pf.vf_info[i].vlan_table[j].vid)
> ==
> - vlan)
> - break;
> - }
> - if (j == cnt) {
> - /* Now check that there's space */
> - if (cnt == getpagesize() /
> - sizeof(struct
> bnxt_vlan_table_entry)) {
> - RTE_LOG(ERR, PMD,
> - "VF %d VLAN table is
> full\n",
> - i);
> - RTE_LOG(ERR, PMD,
> - "cannot add VLAN
> %u\n",
> - vlan);
> - rc = -1;
> - continue;
> - }
> -
> - cnt =
> bp->pf.vf_info[i].vlan_count++;
> - /*
> - * And finally, add to the
> - * end of the table
> - */
> - ve = &bp->pf.vf_info[i].vlan_table[
> cnt];
> - /* TODO: Hardcoded TPID */
> - ve->tpid =
> rte_cpu_to_be_16(0x8100);
> - ve->vid = rte_cpu_to_be_16(vlan);
> - }
> - } else {
> - for (j = 0; cnt; j++) {
> - if (rte_be_to_cpu_16(
> - bp->pf.vf_info[i].vlan_table[j].vid)
> !=
> - vlan)
> - continue;
> - memmove(
> - &bp->pf.vf_info[i].vlan_table[j],
> - &bp->pf.vf_info[i].vlan_table[j
> + 1],
> - getpagesize() -
> - ((j + 1) *
> - sizeof(struct
> bnxt_vlan_table_entry)));
> - j--;
> - cnt =
> bp->pf.vf_info[i].vlan_count--;
> + if (j == cnt) {
> + /* Now check that there's space */
> + if (cnt == getpagesize() /
> + sizeof(struct bnxt_vlan_table_entry)) {
> + RTE_LOG(ERR, PMD,
> + "VF %d VLAN table is
> full\n",
> + i);
> + RTE_LOG(ERR, PMD,
> + "cannot add VLAN %u\n",
> vlan);
> + rc = -1;
> + continue;
> }
> +
> + /* cnt is one less than vlan_count */
> + cnt = bp->pf.vf_info[i].vlan_count++;
> + /*
> + * And finally, add to the
> + * end of the table
> + */
> + ve = &bp->pf.vf_info[i].vlan_table[cnt];
> + /* TODO: Hardcoded TPID */
> + ve->tpid = rte_cpu_to_be_16(0x8100);
> + ve->vid = rte_cpu_to_be_16(vlan);
> + }
> + } else {
> + for (j = 0; j < cnt; j++) {
> + if (rte_be_to_cpu_16(
> + bp->pf.vf_info[i].vlan_table[j].vid)
> != vlan)
> + continue;
> + memmove(&bp->pf.vf_info[i].vlan_table[j],
> + &bp->pf.vf_info[i].vlan_table[j +
> 1],
> + getpagesize() - ((j + 1) *
> + sizeof(struct
> bnxt_vlan_table_entry)));
> + j--;
> + cnt = --bp->pf.vf_info[i].vlan_count;
> }
> - rte_pmd_bnxt_set_vf_vlan_anti_
> spoof(dev->data->port_id,
> - i, bp->pf.vf_info[i].vlan_spoof_
> en);
> }
> + rte_pmd_bnxt_set_vf_vlan_anti_spoof(dev->data->port_id, i,
> + bp->pf.vf_info[i].vlan_spoof_en);
> }
>
> return rc;
> --
> 2.10.1 (Apple Git-78)
>
>
--
Stephen Hurd
949-926-8039
stephen.hurd at broadcom.com
More information about the dev
mailing list