VYPR
Unrated severityNVD Advisory· Published May 28, 2026

CVE-2026-46237

CVE-2026-46237

Description

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

drm/amdgpu/vcn3: Avoid overflow on msg bound check

As pointed out by SDL, the previous condition may be vulnerable to overflow.

(cherry picked from commit db00257ac9e4a51eb2515aaea161a019f7125e10)

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

An integer overflow in the Linux kernel's amdgpu VCN3 message boundary check could allow a local attacker to bypass validation.

Vulnerability

In the Linux kernel, the drm/amdgpu/vcn3 driver contains an integer overflow vulnerability in the message boundary check. The previous condition used to validate message bounds was susceptible to overflow, as reported by SDL. This affects versions prior to the commit db00257ac9e4a51eb2515aaea161a019f7125e10 (backported as 016b64a0313ea5346cf526e30c8d3e66aca10175) [1].

Exploitation

An attacker with local access and the ability to submit crafted messages to the VCN3 hardware block could trigger the overflow. The exact exploitation steps are not detailed in the available references, but the vulnerability lies in the boundary check logic that could be bypassed via an overflow [1].

Impact

Successful exploitation could allow an attacker to bypass the message size validation, potentially leading to memory corruption or other undefined behavior. The impact is limited to systems with AMD GPUs using the VCN3 engine [1].

Mitigation

The fix is included in the Linux kernel commit db00257ac9e4a51eb2515aaea161a019f7125e10, backported as 016b64a0313ea5346cf526e30c8d3e66aca10175. Users should update to a kernel version containing this commit. No workaround is mentioned in the available references [1].

AI Insight generated on May 28, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected products

1

Patches

11
016b64a0313e

drm/amdgpu/vcn3: Avoid overflow on msg bound check

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitBenjamin ChengApr 13, 2026Fixed in 6.18.32via kernel-cna
2 files changed · +6 4
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 558d3bf7fc76ee..8b226edfbea3ed 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1971,6 +1971,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1978,7 +1979,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 558d3bf7fc76ee..8b226edfbea3ed 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1971,6 +1971,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1978,7 +1979,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
2e43b66fceac

drm/amdgpu/vcn3: Avoid overflow on msg bound check

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitBenjamin ChengApr 13, 2026Fixed in 7.0.9via kernel-cna
2 files changed · +6 4
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 6fb4fcdbba4f14..2fe5b3fe287f93 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1972,6 +1972,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1979,7 +1980,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 6fb4fcdbba4f14..2fe5b3fe287f93 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1972,6 +1972,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1979,7 +1980,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
e6e9faba8100

drm/amdgpu/vcn3: Avoid overflow on msg bound check

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitBenjamin ChengApr 13, 2026Fixed in 7.1-rc2via kernel-cna
2 files changed · +6 4
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 4924da5af5e735..81bba3ec2a9378 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1973,6 +1973,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1980,7 +1981,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 4924da5af5e735..81bba3ec2a9378 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1973,6 +1973,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1980,7 +1981,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
1936310f68c5

drm/amdgpu/vcn3: Avoid overflow on msg bound check

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitBenjamin ChengApr 13, 2026Fixed in 6.6.140via kernel-cna
2 files changed · +6 4
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 8d1b6a06194fb1..c9345da548a615 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1852,6 +1852,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1859,7 +1860,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 8d1b6a06194fb1..c9345da548a615 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1852,6 +1852,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1859,7 +1860,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
e8124121b79a

drm/amdgpu/vcn3: Avoid overflow on msg bound check

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitBenjamin ChengApr 13, 2026Fixed in 6.12.90via kernel-cna
2 files changed · +6 4
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index be9151bd2c7208..f4ac8bcdb70a50 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1906,6 +1906,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1913,7 +1914,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index be9151bd2c7208..f4ac8bcdb70a50 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1906,6 +1906,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1913,7 +1914,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
db00257ac9e4

drm/amdgpu/vcn3: Avoid overflow on msg bound check

https://github.com/torvalds/linuxBenjamin ChengApr 13, 2026via text-mined
1 file changed · +3 1
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 1 modified
    @@ -1973,14 +1973,16 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
     
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    
016b64a0313e

drm/amdgpu/vcn3: Avoid overflow on msg bound check

2 files changed · +6 4
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 558d3bf7fc76ee..8b226edfbea3ed 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1971,6 +1971,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1978,7 +1979,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 558d3bf7fc76ee..8b226edfbea3ed 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1971,6 +1971,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1978,7 +1979,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
2e43b66fceac

drm/amdgpu/vcn3: Avoid overflow on msg bound check

2 files changed · +6 4
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 6fb4fcdbba4f14..2fe5b3fe287f93 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1972,6 +1972,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1979,7 +1980,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 6fb4fcdbba4f14..2fe5b3fe287f93 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1972,6 +1972,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1979,7 +1980,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
e6e9faba8100

drm/amdgpu/vcn3: Avoid overflow on msg bound check

2 files changed · +6 4
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 4924da5af5e735..81bba3ec2a9378 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1973,6 +1973,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1980,7 +1981,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 4924da5af5e735..81bba3ec2a9378 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1973,6 +1973,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1980,7 +1981,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
e8124121b79a

drm/amdgpu/vcn3: Avoid overflow on msg bound check

2 files changed · +6 4
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index be9151bd2c7208..f4ac8bcdb70a50 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1906,6 +1906,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1913,7 +1914,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index be9151bd2c7208..f4ac8bcdb70a50 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1906,6 +1906,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1913,7 +1914,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
1936310f68c5

drm/amdgpu/vcn3: Avoid overflow on msg bound check

2 files changed · +6 4
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 8d1b6a06194fb1..c9345da548a615 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1852,6 +1852,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1859,7 +1860,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c+3 2 modified
    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    index 8d1b6a06194fb1..c9345da548a615 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
    @@ -1852,6 +1852,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     
     	for (i = 0, msg = &msg[6]; i < num_buffers; ++i, msg += 4) {
     		uint32_t offset, size, *create;
    +		uint64_t buf_end;
     
     		if (msg[0] != RDECODE_MESSAGE_CREATE)
     			continue;
    @@ -1859,7 +1860,8 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
     		offset = msg[1];
     		size = msg[2];
     
    -		if (size < 4 || offset + size > end - addr) {
    +		if (size < 4 || check_add_overflow(offset, size, &buf_end) ||
    +		    buf_end > end - addr) {
     			DRM_ERROR("VCN message buffer exceeds BO bounds!\n");
     			r = -EINVAL;
     			goto out;
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Integer overflow in the buffer bounds check in vcn_v3_0_dec_msg due to 32-bit addition wrapping."

Attack vector

An attacker with the ability to submit a crafted VCN decode command buffer to the AMDGPU kernel driver can supply `offset` and `size` values whose 32-bit addition wraps to a small result, bypassing the original `offset + size > end - addr` check. This integer overflow lets the attacker read beyond the allocated buffer object (BO), leading to an out-of-bounds read. The attack requires local access to submit DRM command submissions to the amdgpu device.

Affected code

The vulnerability resides in the `vcn_v3_0_dec_msg` function in `drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c`. The original bound check `offset + size > end - addr` performed a 32-bit addition that could wrap around, allowing an attacker to bypass the bounds check and cause out-of-bounds reads.

What the fix does

The patch replaces the direct 32-bit addition `offset + size` with the safe `check_add_overflow(offset, size, &buf_end)` helper, which detects whether the addition would overflow a 64-bit result stored in `buf_end`. If overflow is detected, the check fails and the function returns `-EINVAL`. This closes the integer-overflow vulnerability that could previously let an attacker bypass the buffer bounds check.

Preconditions

  • authThe attacker must be able to submit DRM command submissions to the amdgpu device (local access).
  • inputThe attacker must craft a VCN decode message with offset and size values whose 32-bit sum overflows.

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

References

5

News mentions

0

No linked articles in our index yet.