kmsdrm: free the connector when looking for available devices

Fixes https://github.com/libsdl-org/SDL/issues/10499
This commit is contained in:
Sam Lantinga
2024-08-07 18:13:00 -07:00
parent 058781f514
commit 1a57ea7fba

View File

@@ -96,7 +96,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,
@@ -122,7 +122,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]);
@@ -133,20 +133,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);
@@ -157,11 +158,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);
} }
} }