Hi On Tue, Jul 13, 2021 at 12:51:14PM +0000, Zheyu Ma wrote: > The user can pass in any value to the driver through the 'ioctl' > interface. The driver dost not check, which may cause DoS bugs. > > Fix this by checking if the divisor is 0 This fix is trying to avoid the situation on a too low layer. Could you please try to look at validating the inputs on a much higher level, in kyro_dev_overlay_viewport_set(). Then the checks are much more obvious and you are more likely to catch a number of similar bugs that the test just fails to trigger for now. Sam > > The following log reveals it: > > divide error: 0000 [#1] PREEMPT SMP KASAN PTI > RIP: 0010:SetOverlayViewPort+0x133/0x5f0 drivers/video/fbdev/kyro/STG4000OverlayDevice.c:476 > Call Trace: > kyro_dev_overlay_viewport_set drivers/video/fbdev/kyro/fbdev.c:378 [inline] > kyrofb_ioctl+0x2eb/0x330 drivers/video/fbdev/kyro/fbdev.c:603 > do_fb_ioctl+0x1f3/0x700 drivers/video/fbdev/core/fbmem.c:1171 > fb_ioctl+0xeb/0x130 drivers/video/fbdev/core/fbmem.c:1185 > vfs_ioctl fs/ioctl.c:48 [inline] > __do_sys_ioctl fs/ioctl.c:753 [inline] > __se_sys_ioctl fs/ioctl.c:739 [inline] > __x64_sys_ioctl+0x19b/0x220 fs/ioctl.c:739 > do_syscall_64+0x32/0x80 arch/x86/entry/common.c:46 > entry_SYSCALL_64_after_hwframe+0x44/0xae > > Signed-off-by: Zheyu Ma <zheyuma97@xxxxxxxxx> > --- > drivers/video/fbdev/kyro/STG4000OverlayDevice.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/video/fbdev/kyro/STG4000OverlayDevice.c b/drivers/video/fbdev/kyro/STG4000OverlayDevice.c > index 9fde0e3b69ec..29d692fe5e75 100644 > --- a/drivers/video/fbdev/kyro/STG4000OverlayDevice.c > +++ b/drivers/video/fbdev/kyro/STG4000OverlayDevice.c > @@ -407,6 +407,9 @@ int SetOverlayViewPort(volatile STG4000REG __iomem *pSTGReg, > ulVertDecFactor = 1; > } > > + if ((ulDest + 1) == 0) > + return -EINVAL; > + > ulDacYScale = ((ulSrc - 1) * 2048) / (ulDest + 1); > > tmp = STG_READ_REG(DACOverlayVtDec); /* Decimation */ > @@ -471,6 +474,9 @@ int SetOverlayViewPort(volatile STG4000REG __iomem *pSTGReg, > */ > ulScaleLeft = ulSrcLeft; > > + if ((ulRight - ulLeft + 2) == 0) > + return -EINVAL; > + > /* shift fxscale until it is in the range of the scaler */ > ulhDecim = 0; > ulScale = (((ulSrcRight - ulSrcLeft) - 1) << (11 - ulhDecim)) / (ulRight - ulLeft + 2); > -- > 2.17.6