• Johannes Weiner's avatar
    fbcon: don't use vc_resize() on initialization · 0035fe00
    Johannes Weiner authored
    Catalin and kmemleak spotted a leak of a VC screen buffer in
    vc_allocate() due to the following chain of events:
    
    	vc_allocate()
    	  visual_init(init=1)
    	    vc->vc_sw->con_init(init=1)
                  fbcon_init()
    	        vc_resize()
    	          vc->screen_buf = kmalloc()
    	  vc->screen_buf = kmalloc()
    
    The common way for the VC drivers is to set the screen dimension
    parameters manually in the init case and only call vc_resize() for
    !init - which allocates a screen buffer according to the new
    dimensions.
    
    fbcon instead would do vc_resize() unconditionally and afterwards set
    the dimensions manually (again) for !init - i.e. completely upside
    down.  The vc_resize() allocated buffer would then get lost by
    vc_allocate() allocating a fresh one.
    
    Use vc_resize() only for actual resizing to close the leak.
    
    Set the dimensions manually only in initialization mode to remove the
    redundant setting in resize mode.
    
    The kmemleak trace from Catalin:
    
    unreferenced object 0xde15...
    0035fe00
fbcon.c 85 KB