VYPR
Unrated severityNVD Advisory· Published May 28, 2026

CVE-2026-46181

CVE-2026-46181

Description

In the Linux kernel, the following vulnerability has been resolved:

RDMA/mlx4: Fix mis-use of RCU in mlx4_srq_event()

Sashiko points out the radix_tree itself is RCU safe, but nothing ever frees the mlx4_srq struct with RCU, and it isn't even accessed within the RCU critical section. It also will crash if an event is delivered before the srq object is finished initializing.

Use the spinlock since it isn't easy to make RCU work, use refcount_inc_not_zero() to protect against partially initialized objects, and order the refcount_set() to be after the srq is fully initialized.

Affected products

1

Patches

6
1e2a44875b6a

RDMA/mlx4: Fix mis-use of RCU in mlx4_srq_event()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitJason GunthorpeApr 28, 2026Fixed in 6.18.30via kernel-cna
2 files changed · +14 14
  • drivers/net/ethernet/mellanox/mlx4/srq.c+7 7 modified
    diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
    index dd890f5d7b725c..8711689120f302 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/srq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
    @@ -44,13 +44,14 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type)
     {
     	struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
     	struct mlx4_srq *srq;
    +	unsigned long flags;
     
    -	rcu_read_lock();
    +	spin_lock_irqsave(&srq_table->lock, flags);
     	srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
    -	rcu_read_unlock();
    -	if (srq)
    -		refcount_inc(&srq->refcount);
    -	else {
    +	if (!srq || !refcount_inc_not_zero(&srq->refcount))
    +		srq = NULL;
    +	spin_unlock_irqrestore(&srq_table->lock, flags);
    +	if (!srq) {
     		mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
     		return;
     	}
    @@ -203,8 +204,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
     	if (err)
     		goto err_radix;
     
    -	refcount_set(&srq->refcount, 1);
     	init_completion(&srq->free);
    +	refcount_set_release(&srq->refcount, 1);
     
     	return 0;
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/ethernet/mellanox/mlx4/srq.c+7 7 modified
    diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
    index dd890f5d7b725c..8711689120f302 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/srq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
    @@ -44,13 +44,14 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type)
     {
     	struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
     	struct mlx4_srq *srq;
    +	unsigned long flags;
     
    -	rcu_read_lock();
    +	spin_lock_irqsave(&srq_table->lock, flags);
     	srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
    -	rcu_read_unlock();
    -	if (srq)
    -		refcount_inc(&srq->refcount);
    -	else {
    +	if (!srq || !refcount_inc_not_zero(&srq->refcount))
    +		srq = NULL;
    +	spin_unlock_irqrestore(&srq_table->lock, flags);
    +	if (!srq) {
     		mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
     		return;
     	}
    @@ -203,8 +204,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
     	if (err)
     		goto err_radix;
     
    -	refcount_set(&srq->refcount, 1);
     	init_completion(&srq->free);
    +	refcount_set_release(&srq->refcount, 1);
     
     	return 0;
     
    -- 
    cgit 1.3-korg
    
    
    
8b7833f3bce3

RDMA/mlx4: Fix mis-use of RCU in mlx4_srq_event()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitJason GunthorpeApr 28, 2026Fixed in 7.0.7via kernel-cna
2 files changed · +14 14
  • drivers/net/ethernet/mellanox/mlx4/srq.c+7 7 modified
    diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
    index dd890f5d7b725c..8711689120f302 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/srq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
    @@ -44,13 +44,14 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type)
     {
     	struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
     	struct mlx4_srq *srq;
    +	unsigned long flags;
     
    -	rcu_read_lock();
    +	spin_lock_irqsave(&srq_table->lock, flags);
     	srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
    -	rcu_read_unlock();
    -	if (srq)
    -		refcount_inc(&srq->refcount);
    -	else {
    +	if (!srq || !refcount_inc_not_zero(&srq->refcount))
    +		srq = NULL;
    +	spin_unlock_irqrestore(&srq_table->lock, flags);
    +	if (!srq) {
     		mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
     		return;
     	}
    @@ -203,8 +204,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
     	if (err)
     		goto err_radix;
     
    -	refcount_set(&srq->refcount, 1);
     	init_completion(&srq->free);
    +	refcount_set_release(&srq->refcount, 1);
     
     	return 0;
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/ethernet/mellanox/mlx4/srq.c+7 7 modified
    diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
    index dd890f5d7b725c..8711689120f302 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/srq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
    @@ -44,13 +44,14 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type)
     {
     	struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
     	struct mlx4_srq *srq;
    +	unsigned long flags;
     
    -	rcu_read_lock();
    +	spin_lock_irqsave(&srq_table->lock, flags);
     	srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
    -	rcu_read_unlock();
    -	if (srq)
    -		refcount_inc(&srq->refcount);
    -	else {
    +	if (!srq || !refcount_inc_not_zero(&srq->refcount))
    +		srq = NULL;
    +	spin_unlock_irqrestore(&srq_table->lock, flags);
    +	if (!srq) {
     		mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
     		return;
     	}
    @@ -203,8 +204,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
     	if (err)
     		goto err_radix;
     
    -	refcount_set(&srq->refcount, 1);
     	init_completion(&srq->free);
    +	refcount_set_release(&srq->refcount, 1);
     
     	return 0;
     
    -- 
    cgit 1.3-korg
    
    
    
c9341307ea16

RDMA/mlx4: Fix mis-use of RCU in mlx4_srq_event()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitJason GunthorpeApr 28, 2026Fixed in 7.1-rc3via kernel-cna
2 files changed · +14 14
  • drivers/net/ethernet/mellanox/mlx4/srq.c+7 7 modified
    diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
    index dd890f5d7b725c..8711689120f302 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/srq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
    @@ -44,13 +44,14 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type)
     {
     	struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
     	struct mlx4_srq *srq;
    +	unsigned long flags;
     
    -	rcu_read_lock();
    +	spin_lock_irqsave(&srq_table->lock, flags);
     	srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
    -	rcu_read_unlock();
    -	if (srq)
    -		refcount_inc(&srq->refcount);
    -	else {
    +	if (!srq || !refcount_inc_not_zero(&srq->refcount))
    +		srq = NULL;
    +	spin_unlock_irqrestore(&srq_table->lock, flags);
    +	if (!srq) {
     		mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
     		return;
     	}
    @@ -203,8 +204,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
     	if (err)
     		goto err_radix;
     
    -	refcount_set(&srq->refcount, 1);
     	init_completion(&srq->free);
    +	refcount_set_release(&srq->refcount, 1);
     
     	return 0;
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/ethernet/mellanox/mlx4/srq.c+7 7 modified
    diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
    index dd890f5d7b725c..8711689120f302 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/srq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
    @@ -44,13 +44,14 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type)
     {
     	struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
     	struct mlx4_srq *srq;
    +	unsigned long flags;
     
    -	rcu_read_lock();
    +	spin_lock_irqsave(&srq_table->lock, flags);
     	srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
    -	rcu_read_unlock();
    -	if (srq)
    -		refcount_inc(&srq->refcount);
    -	else {
    +	if (!srq || !refcount_inc_not_zero(&srq->refcount))
    +		srq = NULL;
    +	spin_unlock_irqrestore(&srq_table->lock, flags);
    +	if (!srq) {
     		mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
     		return;
     	}
    @@ -203,8 +204,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
     	if (err)
     		goto err_radix;
     
    -	refcount_set(&srq->refcount, 1);
     	init_completion(&srq->free);
    +	refcount_set_release(&srq->refcount, 1);
     
     	return 0;
     
    -- 
    cgit 1.3-korg
    
    
    
1e2a44875b6a

RDMA/mlx4: Fix mis-use of RCU in mlx4_srq_event()

2 files changed · +14 14
  • drivers/net/ethernet/mellanox/mlx4/srq.c+7 7 modified
    diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
    index dd890f5d7b725c..8711689120f302 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/srq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
    @@ -44,13 +44,14 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type)
     {
     	struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
     	struct mlx4_srq *srq;
    +	unsigned long flags;
     
    -	rcu_read_lock();
    +	spin_lock_irqsave(&srq_table->lock, flags);
     	srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
    -	rcu_read_unlock();
    -	if (srq)
    -		refcount_inc(&srq->refcount);
    -	else {
    +	if (!srq || !refcount_inc_not_zero(&srq->refcount))
    +		srq = NULL;
    +	spin_unlock_irqrestore(&srq_table->lock, flags);
    +	if (!srq) {
     		mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
     		return;
     	}
    @@ -203,8 +204,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
     	if (err)
     		goto err_radix;
     
    -	refcount_set(&srq->refcount, 1);
     	init_completion(&srq->free);
    +	refcount_set_release(&srq->refcount, 1);
     
     	return 0;
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/ethernet/mellanox/mlx4/srq.c+7 7 modified
    diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
    index dd890f5d7b725c..8711689120f302 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/srq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
    @@ -44,13 +44,14 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type)
     {
     	struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
     	struct mlx4_srq *srq;
    +	unsigned long flags;
     
    -	rcu_read_lock();
    +	spin_lock_irqsave(&srq_table->lock, flags);
     	srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
    -	rcu_read_unlock();
    -	if (srq)
    -		refcount_inc(&srq->refcount);
    -	else {
    +	if (!srq || !refcount_inc_not_zero(&srq->refcount))
    +		srq = NULL;
    +	spin_unlock_irqrestore(&srq_table->lock, flags);
    +	if (!srq) {
     		mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
     		return;
     	}
    @@ -203,8 +204,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
     	if (err)
     		goto err_radix;
     
    -	refcount_set(&srq->refcount, 1);
     	init_completion(&srq->free);
    +	refcount_set_release(&srq->refcount, 1);
     
     	return 0;
     
    -- 
    cgit 1.3-korg
    
    
    
c9341307ea16

RDMA/mlx4: Fix mis-use of RCU in mlx4_srq_event()

2 files changed · +14 14
  • drivers/net/ethernet/mellanox/mlx4/srq.c+7 7 modified
    diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
    index dd890f5d7b725c..8711689120f302 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/srq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
    @@ -44,13 +44,14 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type)
     {
     	struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
     	struct mlx4_srq *srq;
    +	unsigned long flags;
     
    -	rcu_read_lock();
    +	spin_lock_irqsave(&srq_table->lock, flags);
     	srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
    -	rcu_read_unlock();
    -	if (srq)
    -		refcount_inc(&srq->refcount);
    -	else {
    +	if (!srq || !refcount_inc_not_zero(&srq->refcount))
    +		srq = NULL;
    +	spin_unlock_irqrestore(&srq_table->lock, flags);
    +	if (!srq) {
     		mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
     		return;
     	}
    @@ -203,8 +204,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
     	if (err)
     		goto err_radix;
     
    -	refcount_set(&srq->refcount, 1);
     	init_completion(&srq->free);
    +	refcount_set_release(&srq->refcount, 1);
     
     	return 0;
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/ethernet/mellanox/mlx4/srq.c+7 7 modified
    diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
    index dd890f5d7b725c..8711689120f302 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/srq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
    @@ -44,13 +44,14 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type)
     {
     	struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
     	struct mlx4_srq *srq;
    +	unsigned long flags;
     
    -	rcu_read_lock();
    +	spin_lock_irqsave(&srq_table->lock, flags);
     	srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
    -	rcu_read_unlock();
    -	if (srq)
    -		refcount_inc(&srq->refcount);
    -	else {
    +	if (!srq || !refcount_inc_not_zero(&srq->refcount))
    +		srq = NULL;
    +	spin_unlock_irqrestore(&srq_table->lock, flags);
    +	if (!srq) {
     		mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
     		return;
     	}
    @@ -203,8 +204,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
     	if (err)
     		goto err_radix;
     
    -	refcount_set(&srq->refcount, 1);
     	init_completion(&srq->free);
    +	refcount_set_release(&srq->refcount, 1);
     
     	return 0;
     
    -- 
    cgit 1.3-korg
    
    
    
8b7833f3bce3

RDMA/mlx4: Fix mis-use of RCU in mlx4_srq_event()

2 files changed · +14 14
  • drivers/net/ethernet/mellanox/mlx4/srq.c+7 7 modified
    diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
    index dd890f5d7b725c..8711689120f302 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/srq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
    @@ -44,13 +44,14 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type)
     {
     	struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
     	struct mlx4_srq *srq;
    +	unsigned long flags;
     
    -	rcu_read_lock();
    +	spin_lock_irqsave(&srq_table->lock, flags);
     	srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
    -	rcu_read_unlock();
    -	if (srq)
    -		refcount_inc(&srq->refcount);
    -	else {
    +	if (!srq || !refcount_inc_not_zero(&srq->refcount))
    +		srq = NULL;
    +	spin_unlock_irqrestore(&srq_table->lock, flags);
    +	if (!srq) {
     		mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
     		return;
     	}
    @@ -203,8 +204,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
     	if (err)
     		goto err_radix;
     
    -	refcount_set(&srq->refcount, 1);
     	init_completion(&srq->free);
    +	refcount_set_release(&srq->refcount, 1);
     
     	return 0;
     
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/ethernet/mellanox/mlx4/srq.c+7 7 modified
    diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
    index dd890f5d7b725c..8711689120f302 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/srq.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
    @@ -44,13 +44,14 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type)
     {
     	struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
     	struct mlx4_srq *srq;
    +	unsigned long flags;
     
    -	rcu_read_lock();
    +	spin_lock_irqsave(&srq_table->lock, flags);
     	srq = radix_tree_lookup(&srq_table->tree, srqn & (dev->caps.num_srqs - 1));
    -	rcu_read_unlock();
    -	if (srq)
    -		refcount_inc(&srq->refcount);
    -	else {
    +	if (!srq || !refcount_inc_not_zero(&srq->refcount))
    +		srq = NULL;
    +	spin_unlock_irqrestore(&srq_table->lock, flags);
    +	if (!srq) {
     		mlx4_warn(dev, "Async event for bogus SRQ %08x\n", srqn);
     		return;
     	}
    @@ -203,8 +204,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
     	if (err)
     		goto err_radix;
     
    -	refcount_set(&srq->refcount, 1);
     	init_completion(&srq->free);
    +	refcount_set_release(&srq->refcount, 1);
     
     	return 0;
     
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Missing RCU lifecycle for the mlx4_srq struct and lack of ordering between refcount initialization and object insertion into the radix tree allow a use-after-free or use of a partially-initialized object when an asynchronous event arrives."

Attack vector

An attacker who can trigger an asynchronous SRQ event (e.g., via RDMA hardware operations) before the SRQ object is fully initialized, or after it has been freed without RCU grace period, can cause the kernel to access a dangling or partially-initialized mlx4_srq pointer. The old code used rcu_read_lock() only to protect the radix tree lookup, but the mlx4_srq struct itself was never freed with RCU, so the reference taken via refcount_inc() could race with object destruction. Additionally, refcount_set() was called before init_completion(), so an early event could observe refcount==1 on an incompletely initialized object [patch_id=2897985].

Affected code

The vulnerable code is in drivers/net/ethernet/mellanox/mlx4/srq.c, specifically the mlx4_srq_event() function (radix tree lookup and refcount handling) and the mlx4_srq_alloc() function (ordering of refcount_set and init_completion) [patch_id=2897985].

What the fix does

The patch replaces rcu_read_lock/unlock with spin_lock_irqsave/restore around the radix tree lookup, ensuring the srq pointer remains valid under the lock. It changes refcount_inc() to refcount_inc_not_zero(), so that if the object is already being freed (refcount zero) the lookup returns NULL instead of incrementing a stale reference. In mlx4_srq_alloc(), refcount_set_release() is moved after init_completion(), guaranteeing the object is fully initialized before the refcount becomes visible to concurrent event handlers [patch_id=2897985].

Preconditions

  • inputThe attacker must be able to trigger an asynchronous SRQ event (e.g., via RDMA hardware operations) on a Mellanox mlx4 device.
  • configThe race window exists between SRQ allocation and its full initialization, or between SRQ destruction and the event handler's reference increment.

Generated on May 28, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

3

News mentions

0

No linked articles in our index yet.