Sfoglia il codice sorgente

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>
Antonino A. Daplas 18 anni fa
parent
commit
4941cb7a18
1 ha cambiato i file con 3 aggiunte e 1 eliminazioni
  1. 3 1
      drivers/video/fbmem.c

+ 3 - 1
drivers/video/fbmem.c

@@ -803,6 +803,8 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
 
 
 	if ((var->activate & FB_ACTIVATE_FORCE) ||
 	if ((var->activate & FB_ACTIVATE_FORCE) ||
 	    memcmp(&info->var, var, sizeof(struct fb_var_screeninfo))) {
 	    memcmp(&info->var, var, sizeof(struct fb_var_screeninfo))) {
+		u32 activate = var->activate;
+
 		if (!info->fbops->fb_check_var) {
 		if (!info->fbops->fb_check_var) {
 			*var = info->var;
 			*var = info->var;
 			return 0;
 			return 0;
@@ -831,7 +833,7 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
 
 
 			if (!err && (flags & FBINFO_MISC_USEREVENT)) {
 			if (!err && (flags & FBINFO_MISC_USEREVENT)) {
 				struct fb_event event;
 				struct fb_event event;
-				int evnt = (var->activate & FB_ACTIVATE_ALL) ?
+				int evnt = (activate & FB_ACTIVATE_ALL) ?
 					FB_EVENT_MODE_CHANGE_ALL :
 					FB_EVENT_MODE_CHANGE_ALL :
 					FB_EVENT_MODE_CHANGE;
 					FB_EVENT_MODE_CHANGE;