xwayland: handle case without any crtc

Xwayland creates and destroys the CRTC along with the Wayland outputs, so there is possibly a case where the number of CRTC drops to 0.

However, xwl_present_get_crtc() always return crtcs[0] which is invalid when numCrtcs is 0.

That leads to crash if a client queries the Present capabilities when there is no CRTC, the backtrace looks like:

  #0  raise() from libc.so
  #1  abort() from libc.so
  #2  OsAbort() at utils.c:1350
  #3  AbortServer() at log.c:879
  #4  FatalError() at log.c:1017
  #5  OsSigHandler() at osinit.c:156
  #6  OsSigHandler() at osinit.c:110
  #7  <signal handler called>
  #8  main_arena() from libc.so
  #9  proc_present_query_capabilities() at present_request.c:236
  #10 Dispatch() at dispatch.c:478
  #11 dix_main() at main.c:276

To avoid returning an invalid pointer (crtcs[0]) in that case, simply check for numCrtcs being 0 and return NULL in that case.

Thanks to Michel Dänzer michel.daenzer@amd.com for pointing this as a possible cause of the crash.

Signed-off-by: Olivier Fourdan ofourdan@redhat.com Bugzilla: https://bugzilla.redhat.com/1609181

Edited by Adam Jackson

Merge request reports