kmsdrm: free the connector when looking for available devices

Fixes https://github.com/libsdl-org/SDL/issues/10499

(cherry picked from commit 1a57ea7fba)
(cherry picked from commit a5bff78d81)
This commit is contained in:
Sam Lantinga committed 2024-08-08 09:30:33 -07:00
1 parent 403f87340f
commit f75b0aa814
1 file changed
+11 -11
+11 -11
View File
@@ -97,7 +97,7 @@ static int get_driindex(void)
SDL_strlcpy(device + kmsdrm_dri_pathsize, kmsdrm_dri_devname, SDL_strlcpy(device + kmsdrm_dri_pathsize, kmsdrm_dri_devname,
sizeof(device) - kmsdrm_dri_devnamesize); sizeof(device) - kmsdrm_dri_devnamesize);
while((res = readdir(folder)) != NULL) { while((res = readdir(folder)) != NULL && available < 0) {
if (SDL_memcmp(res->d_name, kmsdrm_dri_devname, if (SDL_memcmp(res->d_name, kmsdrm_dri_devname,
kmsdrm_dri_devnamesize) == 0) { kmsdrm_dri_devnamesize) == 0) {
SDL_strlcpy(device + kmsdrm_dri_pathsize + kmsdrm_dri_devnamesize, SDL_strlcpy(device + kmsdrm_dri_pathsize + kmsdrm_dri_devnamesize,
@@ -123,7 +123,7 @@ static int get_driindex(void)
resources->count_encoders > 0 && resources->count_encoders > 0 &&
resources->count_crtcs > 0) { resources->count_crtcs > 0) {
available = -ENOENT; available = -ENOENT;
for (i = 0; i < resources->count_connectors; i++) { for (i = 0; i < resources->count_connectors && available < 0; i++) {
drmModeConnector *conn = drmModeConnector *conn =
KMSDRM_drmModeGetConnector( KMSDRM_drmModeGetConnector(
drm_fd, resources->connectors[i]); drm_fd, resources->connectors[i]);
@@ -134,20 +134,21 @@ static int get_driindex(void)
if (conn->connection == DRM_MODE_CONNECTED && if (conn->connection == DRM_MODE_CONNECTED &&
conn->count_modes) { conn->count_modes) {
SDL_bool access_denied = SDL_FALSE;
if (SDL_GetHintBoolean( if (SDL_GetHintBoolean(
SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER, SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER,
SDL_TRUE)) { SDL_TRUE)) {
/* Skip this device if we can't obtain /* Skip this device if we can't obtain
* DRM master */ * DRM master */
KMSDRM_drmSetMaster(drm_fd); KMSDRM_drmSetMaster(drm_fd);
if (KMSDRM_drmAuthMagic(drm_fd, 0) == if (KMSDRM_drmAuthMagic(drm_fd, 0) == -EACCES) {
-EACCES) { access_denied = SDL_TRUE;
continue;
} }
} }
available = devindex; if (!access_denied) {
break; available = devindex;
}
} }
KMSDRM_drmModeFreeConnector(conn); KMSDRM_drmModeFreeConnector(conn);
@@ -158,11 +159,10 @@ static int get_driindex(void)
SDL_KMSDRM_UnloadSymbols(); SDL_KMSDRM_UnloadSymbols();
} }
close(drm_fd); close(drm_fd);
} else {
SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO,
"Failed to open KMSDRM device %s, errno: %d\n", device, errno);
} }
SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO,
"Failed to open KMSDRM device %s, errno: %d\n", device,
errno);
} }
} }