Blob Blame History Raw
From 779bafa175e6b47da086d84324f95cedd4dc487c Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Thu, 23 May 2019 16:26:15 +0200
Subject: [PATCH] Avoid RADEONLeaveVT_KMS() after we left the VT

RADEONLeaveVT_KMS() will un-reference its all-black FB in a timer, but
if we end calling RADEONLeaveVT_KMS() twice in a row, we may try to
access those after they've been just freed up, and crash.

Return early in RADEONLeaveVT_KMS() if the VT semaphore is unset.

Bugzilla: https://bugzilla.redhat.com/1674474
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
---
 src/radeon_kms.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index ff4f8dcf..0d4d2ef4 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -2624,6 +2624,9 @@ void RADEONLeaveVT_KMS(ScrnInfoPtr pScrn)
     xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
 		   "RADEONLeaveVT_KMS\n");
 
+    if (xf86ScreenToScrn(pScreen)->vtSema)
+	return;
+
     if (!info->r600_shadow_fb) {
 	RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-- 
2.21.0