From: Roman Smirnov <hidden> Date: 2024-03-05 13:52:56
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 <redacted>
Reviewed-by: Sergey Shtylyov <redacted>
---
V1 -> V2: Replaced the code of the first version with a check.
drivers/video/fbdev/core/fbmon.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -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&&(vm->pixelclock/htotal>=vtotal)){fbmode->refresh=vm->pixelclock/(htotal*vtotal);/* a mode must have htotal and vtotal != 0 or it is invalid */}else{
The expression htotal * vtotal can have a zero value on
overflow.
I'm not sure if thos always results in zero in kernel on overflow.
Might be architecture-depended too, but let's assume it
can become zero, ....
quoted hunk
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 <redacted>
Reviewed-by: Sergey Shtylyov <redacted>
---
V1 -> V2: Replaced the code of the first version with a check.
drivers/video/fbdev/core/fbmon.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -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&&(vm->pixelclock/htotal>=vtotal)){
why don't you then simply check for
if .. ((htotal * vtotal) == 0) ...
instead?
Helge
fbmode->refresh = vm->pixelclock / (htotal * vtotal);
/* a mode must have htotal and vtotal != 0 or it is invalid */
} else {
From: Roman Smirnov <hidden> Date: 2024-03-18 08:11:56
On Fri, 15 Mar 2024 09:44:08 +0100 Helge Deller wrote:
On 3/5/24 14:51, Roman Smirnov wrote:
quoted
The expression htotal * vtotal can have a zero value on
overflow.
I'm not sure if thos always results in zero in kernel on overflow.
Might be architecture-depended too, but let's assume it
can become zero, ....
quoted
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 <redacted>
Reviewed-by: Sergey Shtylyov <redacted>
---
V1 -> V2: Replaced the code of the first version with a check.
drivers/video/fbdev/core/fbmon.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -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&&(vm->pixelclock/htotal>=vtotal)){
why don't you then simply check for
if .. ((htotal * vtotal) == 0) ...
instead?
Helge
Thomas Zimmermann from the previous discussion said:
On Tue, 5 Mar 2024 11:18:05 +0100 Thomas Zimmerman wrote:
Maybe use
if (htotal && vtotal && (vm->pixelclock / htotal >= vtotal))
for the test. That rules out overflowing multiplication and sets
refresh to 0 in such cases.
This prevents overflow, which is also a problematic case.
On Fri, 15 Mar 2024 09:44:08 +0100 Helge Deller wrote:
quoted
On 3/5/24 14:51, Roman Smirnov wrote:
quoted
The expression htotal * vtotal can have a zero value on
overflow.
I'm not sure if those always results in zero in kernel on overflow.
Might be architecture-depended too, but let's assume it
can become zero, ....
quoted
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 <redacted>
Reviewed-by: Sergey Shtylyov <redacted>
---
V1 -> V2: Replaced the code of the first version with a check.
drivers/video/fbdev/core/fbmon.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -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&&(vm->pixelclock/htotal>=vtotal)){
why don't you then simply check for
if .. ((htotal * vtotal) == 0) ...
instead?
Helge
Thomas Zimmermann from the previous discussion said:
On Tue, 5 Mar 2024 11:18:05 +0100 Thomas Zimmerman wrote:
quoted
Maybe use
if (htotal && vtotal && (vm->pixelclock / htotal >= vtotal))
for the test. That rules out overflowing multiplication and sets
refresh to 0 in such cases.
This prevents overflow, which is also a problematic case.
I don't like adding another division here and I doubt we have
a problem with possible overflow.
So, I suggest to keep it simple, something like:
...
total = htotal * vtotal;
if (total)
fbmode->refresh = vm->pixelclock / total;
else...
Helge
From: Roman Smirnov <hidden> Date: 2024-03-19 08:12:31
On Mon, 18 Mar 2024 20:15:55 +0100 Helge Deller wrote:
On 3/18/24 09:11, Roman Smirnov wrote:
quoted
On Fri, 15 Mar 2024 09:44:08 +0100 Helge Deller wrote:
quoted
On 3/5/24 14:51, Roman Smirnov wrote:
quoted
The expression htotal * vtotal can have a zero value on
overflow.
I'm not sure if those always results in zero in kernel on overflow.
Might be architecture-depended too, but let's assume it
can become zero, ....
quoted
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 <redacted>
Reviewed-by: Sergey Shtylyov <redacted>
---
V1 -> V2: Replaced the code of the first version with a check.
drivers/video/fbdev/core/fbmon.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -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&&(vm->pixelclock/htotal>=vtotal)){
why don't you then simply check for
if .. ((htotal * vtotal) == 0) ...
instead?
Helge
Thomas Zimmermann from the previous discussion said:
On Tue, 5 Mar 2024 11:18:05 +0100 Thomas Zimmerman wrote:
quoted
Maybe use
if (htotal && vtotal && (vm->pixelclock / htotal >= vtotal))
for the test. That rules out overflowing multiplication and sets
refresh to 0 in such cases.
This prevents overflow, which is also a problematic case.
I don't like adding another division here and I doubt we have
a problem with possible overflow.
So, I suggest to keep it simple, something like:
...
total = htotal * vtotal;
if (total)
fbmode->refresh = vm->pixelclock / total;
else...
Okay, I'll prepare a third version with that change:
if (htotal && vtotal && (htotal * vtotal))
I think that will be enough.
The expression htotal * vtotal can have a zero value on
overflow.
I'm not sure if those always results in zero in kernel on overflow.
Might be architecture-depended too, but let's assume it
can become zero, ....
quoted
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 <redacted>
Reviewed-by: Sergey Shtylyov <redacted>
---
V1 -> V2: Replaced the code of the first version with a check.
drivers/video/fbdev/core/fbmon.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -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&&(vm->pixelclock/htotal>=vtotal)){
why don't you then simply check for
if .. ((htotal * vtotal) == 0) ...
instead?
Helge
Thomas Zimmermann from the previous discussion said:
On Tue, 5 Mar 2024 11:18:05 +0100 Thomas Zimmerman wrote:
quoted
Maybe use
if (htotal && vtotal && (vm->pixelclock / htotal >= vtotal))
for the test. That rules out overflowing multiplication and sets
refresh to 0 in such cases.
This prevents overflow, which is also a problematic case.
I don't like adding another division here and I doubt we have
a problem with possible overflow.
So, I suggest to keep it simple, something like:
...
total = htotal * vtotal;
if (total)
fbmode->refresh = vm->pixelclock / total;
else...
Okay, I'll prepare a third version with that change:
if (htotal && vtotal && (htotal * vtotal))
I think the 1st 2 checks here are now redundant. Also, the inner
parens are not necessary...