提交 6080a893 编写于 作者: T Tomi Valkeinen

fbdev: fix cea_modes array size

CEA defines 64 modes, indexed from 1 to 64. modedb has cea_modes arrays,
which contains 64 entries. However, the code uses the CEA indices
directly, i.e. the first mode is at cea_modes[1]. This means the array
is one too short.

This does not cause references to uninitialized memory as the code in
fbmon only allows indexes up to 63, and the cea_modes does not contain
an entry for the mode 64 so it could not be used in any case.

However, the code contains a check 'if (idx > ARRAY_SIZE(cea_modes)',
and while that check is a no-op as at that point idx cannot be >= 63, it
upsets static checkers.

Fix this by increasing the cea_array size to be 65, and change the code
to allow mode 64.
Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
Reported-by: NDan Carpenter <dan.carpenter@oracle.com>
上级 2c6625cd
...@@ -1072,9 +1072,9 @@ void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs) ...@@ -1072,9 +1072,9 @@ void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs)
for (i = specs->modedb_len + num; i < specs->modedb_len + num + svd_n; i++) { for (i = specs->modedb_len + num; i < specs->modedb_len + num + svd_n; i++) {
int idx = svd[i - specs->modedb_len - num]; int idx = svd[i - specs->modedb_len - num];
if (!idx || idx > 63) { if (!idx || idx >= ARRAY_SIZE(cea_modes)) {
pr_warning("Reserved SVD code %d\n", idx); pr_warning("Reserved SVD code %d\n", idx);
} else if (idx > ARRAY_SIZE(cea_modes) || !cea_modes[idx].xres) { } else if (!cea_modes[idx].xres) {
pr_warning("Unimplemented SVD code %d\n", idx); pr_warning("Unimplemented SVD code %d\n", idx);
} else { } else {
memcpy(&m[i], cea_modes + idx, sizeof(m[i])); memcpy(&m[i], cea_modes + idx, sizeof(m[i]));
......
...@@ -289,7 +289,7 @@ static const struct fb_videomode modedb[] = { ...@@ -289,7 +289,7 @@ static const struct fb_videomode modedb[] = {
}; };
#ifdef CONFIG_FB_MODE_HELPERS #ifdef CONFIG_FB_MODE_HELPERS
const struct fb_videomode cea_modes[64] = { const struct fb_videomode cea_modes[65] = {
/* #1: 640x480p@59.94/60Hz */ /* #1: 640x480p@59.94/60Hz */
[1] = { [1] = {
NULL, 60, 640, 480, 39722, 48, 16, 33, 10, 96, 2, 0, NULL, 60, 640, 480, 39722, 48, 16, 33, 10, 96, 2, 0,
......
...@@ -788,7 +788,7 @@ struct dmt_videomode { ...@@ -788,7 +788,7 @@ struct dmt_videomode {
extern const char *fb_mode_option; extern const char *fb_mode_option;
extern const struct fb_videomode vesa_modes[]; extern const struct fb_videomode vesa_modes[];
extern const struct fb_videomode cea_modes[64]; extern const struct fb_videomode cea_modes[65];
extern const struct dmt_videomode dmt_modes[]; extern const struct dmt_videomode dmt_modes[];
struct fb_modelist { struct fb_modelist {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册