Skip to content
  • dom.constant@free.fr's avatar
    sna: CustomEDID fix · aa36399c
    dom.constant@free.fr authored and Chris Wilson's avatar Chris Wilson committed
    
    
    For my HTPC setup, I'm using the option "CustomEDID".
    With this option, output attaching and destroying events leads to
    crashes.
    
    The following sequence leads to a crash:
    - In xorg.conf: Option "CustomEDID" "HDMI2:/etc/my_edid.bin"
    - Starting Xorg
    - Connect HDMI2
    - Disconnect HDMI2
    - Reconnect HDMI2
      -> Crash
    
    The crash happens in xf86OutputSetEDID
    (xorg/xserver/hw/xfree86/modes/xf86Crtc.c)
    at "free(output->MonInfo)". MonInfo is assigned with
    sna_output->fake_edid_mon
    which is allocated by intel driver in sna_output_load_fake_edid
    (src/sna/sna_display.c).
    
    Sequence details:
    - Starting Xorg
       -> fake_edid_mon is initialized
    
    - Connect HDMI2
       -> xf86OutputSetEDID is called:
           - MonInfo is NULL
           - MonInfo is assigned with fake_edid_mon pointer
           - MonInfo is read by Xorg
    
    - Disconnect HDMI2
    
    - Reconnect HDMI2
       -> xf86OutputSetEDID is called:
           - MonInfo is freed thus also fake_edid_mon
           - MonInfo is assigned with fake_edid_mon
           - MonInfo is read but it was freed -> CRASH
    
    The fix consists of a new instance of xf86MonPtr for each calls of
    xf86OutputSetEDID.
    is initialized with fake_edid_raw which render
    fake_edid_mon useless.
    With this proposal, the behaviour of an EDID override is similar to
    a "real" EDID.
    
    Signed-off-by: default avatarDominique Constant <dom.constant@free.fr>
    Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    aa36399c