Message ID | 20240319081344.7223-1-r.smirnov@omp.ru (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | [v3] fbmon: prevent division by zero in fb_videomode_from_videomode() | expand |
On 3/19/24 09:13, Roman Smirnov wrote: > The expression htotal * vtotal can have a zero value on > overflow. It is necessary to prevent division by zero like in > fb_var_to_videomode(). > > Found by Linux Verification Center (linuxtesting.org) with Svace. > > Signed-off-by: Roman Smirnov <r.smirnov@omp.ru> > Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru> > --- > V1 -> V2: Replaced the code of the first version with a check. > V2 -> V3: Replaced the code of the second version with a zero check > > drivers/video/fbdev/core/fbmon.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/video/fbdev/core/fbmon.c b/drivers/video/fbdev/core/fbmon.c > index 79e5bfbdd34c..ca946919d962 100644 > --- a/drivers/video/fbdev/core/fbmon.c > +++ b/drivers/video/fbdev/core/fbmon.c > @@ -1344,7 +1344,7 @@ int fb_videomode_from_videomode(const struct videomode *vm, > vtotal = vm->vactive + vm->vfront_porch + vm->vback_porch + > vm->vsync_len; > /* prevent division by zero */ > - if (htotal && vtotal) { > + if (htotal && vtotal && (htotal * vtotal)) { > fbmode->refresh = vm->pixelclock / (htotal * vtotal); I modified your patch like this: ... - if (htotal && vtotal) { - fbmode->refresh = vm->pixelclock / (htotal * vtotal); + total = htotal * vtotal; + if (total) { + fbmode->refresh = vm->pixelclock / total; and added it to the fbdev git tree. https://git.kernel.org/pub/scm/linux/kernel/git/deller/linux-fbdev.git/commit/?h=for-next Thanks, Helge
diff --git a/drivers/video/fbdev/core/fbmon.c b/drivers/video/fbdev/core/fbmon.c index 79e5bfbdd34c..ca946919d962 100644 --- a/drivers/video/fbdev/core/fbmon.c +++ b/drivers/video/fbdev/core/fbmon.c @@ -1344,7 +1344,7 @@ int fb_videomode_from_videomode(const struct videomode *vm, vtotal = vm->vactive + vm->vfront_porch + vm->vback_porch + vm->vsync_len; /* prevent division by zero */ - if (htotal && vtotal) { + if (htotal && vtotal && (htotal * vtotal)) { fbmode->refresh = vm->pixelclock / (htotal * vtotal); /* a mode must have htotal and vtotal != 0 or it is invalid */ } else {