Skip to content

Commit

Permalink
fbcon: Fix error paths in set_con2fb_map
Browse files Browse the repository at this point in the history
This is a regressoin introduced in b07db39 ("fbcon: Ditch error
handling for con2fb_release_oldinfo"). I failed to realize what the if
(!err) checks. The mentioned commit was dropping the
con2fb_release_oldinfo() return value but the if (!err) was also
checking whether the con2fb_acquire_newinfo() function call above
failed or not.

Fix this with an early return statement.

Note that there's still a difference compared to the orginal state of
the code, the below lines are now also skipped on error:

	if (!search_fb_in_map(info_idx))
		info_idx = newidx;

These are only needed when we've actually thrown out an old fb_info
from the console mappings, which only happens later on.

Also move the fbcon_add_cursor_work() call into the same if block,
it's all protected by console_lock so doesn't matter when we set up
the blinking cursor delayed work anyway. This further simplifies the
control flow and allows us to ditch the found local variable.

v2: Clarify commit message (Javier)

Signed-off-by: Daniel Vetter <[email protected]>
Reviewed-by: Javier Martinez Canillas <[email protected]>
Acked-by: Helge Deller <[email protected]>
Tested-by: Xingyuan Mo <[email protected]>
Fixes: b07db39 ("fbcon: Ditch error handling for con2fb_release_oldinfo")
Cc: Thomas Zimmermann <[email protected]>
Cc: Sam Ravnborg <[email protected]>
Cc: Xingyuan Mo <[email protected]>
Cc: Thomas Zimmermann <[email protected]>
Cc: Helge Deller <[email protected]>
Cc: <[email protected]> # v5.19+
  • Loading branch information
danvet committed Apr 13, 2023
1 parent a552b73 commit edf79dd
Showing 1 changed file with 8 additions and 9 deletions.
17 changes: 8 additions & 9 deletions drivers/video/fbdev/core/fbcon.c
Original file line number Diff line number Diff line change
Expand Up @@ -823,7 +823,7 @@ static int set_con2fb_map(int unit, int newidx, int user)
int oldidx = con2fb_map[unit];
struct fb_info *info = fbcon_registered_fb[newidx];
struct fb_info *oldinfo = NULL;
int found, err = 0, show_logo;
int err = 0, show_logo;

WARN_CONSOLE_UNLOCKED();

Expand All @@ -841,26 +841,25 @@ static int set_con2fb_map(int unit, int newidx, int user)
if (oldidx != -1)
oldinfo = fbcon_registered_fb[oldidx];

found = search_fb_in_map(newidx);

if (!err && !found) {
if (!search_fb_in_map(newidx)) {
err = con2fb_acquire_newinfo(vc, info, unit);
if (!err)
con2fb_map[unit] = newidx;
if (err)
return err;

con2fb_map[unit] = newidx;
fbcon_add_cursor_work(info);
}

/*
* If old fb is not mapped to any of the consoles,
* fbcon should release it.
*/
if (!err && oldinfo && !search_fb_in_map(oldidx))
if (oldinfo && !search_fb_in_map(oldidx))
con2fb_release_oldinfo(vc, oldinfo, info);

show_logo = (fg_console == 0 && !user &&
logo_shown != FBCON_LOGO_DONTSHOW);

if (!found)
fbcon_add_cursor_work(info);
con2fb_map_boot[unit] = newidx;
con2fb_init_display(vc, info, unit, show_logo);

Expand Down

0 comments on commit edf79dd

Please sign in to comment.