aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntonino A. Daplas <adaplas@gmail.com>2007-05-08 03:39:22 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-08 14:15:31 -0400
commit4941cb7a18fd84d4d8cd097d2beada3c79c8f781 (patch)
tree0f7419539b1d056da12b1124e0a33992a3a00432
parent38b4982c6388ae9596f959e3d7fef91affbd181d (diff)
fbdev: save the activate field before calling fb_check_var()
Some drivers may reset the var->activate field on fb_check_var(). This can lead to undefined behavior. For example, doing fbset -a <option> with vga16fb will only modify the active console instead of modifying all. Signed-off-by: Antonino Daplas <adaplas@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/video/fbmem.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
index c4ce3e44327e..cd1407921af5 100644
--- a/drivers/video/fbmem.c
+++ b/drivers/video/fbmem.c
@@ -803,6 +803,8 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
803 803
804 if ((var->activate & FB_ACTIVATE_FORCE) || 804 if ((var->activate & FB_ACTIVATE_FORCE) ||
805 memcmp(&info->var, var, sizeof(struct fb_var_screeninfo))) { 805 memcmp(&info->var, var, sizeof(struct fb_var_screeninfo))) {
806 u32 activate = var->activate;
807
806 if (!info->fbops->fb_check_var) { 808 if (!info->fbops->fb_check_var) {
807 *var = info->var; 809 *var = info->var;
808 return 0; 810 return 0;
@@ -831,7 +833,7 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
831 833
832 if (!err && (flags & FBINFO_MISC_USEREVENT)) { 834 if (!err && (flags & FBINFO_MISC_USEREVENT)) {
833 struct fb_event event; 835 struct fb_event event;
834 int evnt = (var->activate & FB_ACTIVATE_ALL) ? 836 int evnt = (activate & FB_ACTIVATE_ALL) ?
835 FB_EVENT_MODE_CHANGE_ALL : 837 FB_EVENT_MODE_CHANGE_ALL :
836 FB_EVENT_MODE_CHANGE; 838 FB_EVENT_MODE_CHANGE;
837 839