mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 05:04:02 +02:00
fpga: altera-cvp: Avoid out-of-bounds read in trailing byte write
The trailing byte path in altera_cvp_send_block() dereferences a u32
pointer even when only 1-3 bytes remain in the input buffer. If the buffer
ends at a page or scatterlist boundary, this can read past the valid image
data and fault.
Copy the remaining bytes into a zero-initialized u32 before writing the
final word so only valid bytes are read from the input buffer.
Fixes: 34d1dc17ce ("fpga manager: Add Altera CvP driver")
Cc: stable@vger.kernel.org
Signed-off-by: Daisuke Matsuda <matsuda@preferred.jp>
Reviewed-by: Xu Yilun <yilun.xu@intel.com>
Link: https://lore.kernel.org/r/20260723081912.74082-1-dskmtsd@gmail.com
Signed-off-by: Xu Yilun <yilun.xu@linux.intel.com>
This commit is contained in:
parent
2c972f03cc
commit
9da70a43b5
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/sizes.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#define CVP_BAR 0 /* BAR used for data transfer in memory mode */
|
||||
#define CVP_DUMMY_WR 244 /* dummy writes to clear CvP state machine */
|
||||
|
|
@ -261,7 +262,7 @@ static int altera_cvp_v2_wait_for_credit(struct fpga_manager *mgr,
|
|||
static int altera_cvp_send_block(struct altera_cvp_conf *conf,
|
||||
const u32 *data, size_t len)
|
||||
{
|
||||
u32 mask, words = len / sizeof(u32);
|
||||
u32 words = len / sizeof(u32);
|
||||
int i, remainder;
|
||||
|
||||
for (i = 0; i < words; i++)
|
||||
|
|
@ -270,9 +271,10 @@ static int altera_cvp_send_block(struct altera_cvp_conf *conf,
|
|||
/* write up to 3 trailing bytes, if any */
|
||||
remainder = len % sizeof(u32);
|
||||
if (remainder) {
|
||||
mask = BIT(remainder * 8) - 1;
|
||||
if (mask)
|
||||
conf->write_data(conf, *data & mask);
|
||||
u32 word = 0;
|
||||
|
||||
memcpy(&word, data, remainder);
|
||||
conf->write_data(conf, word);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user