From 1298b9d201fc61cfffc6f82d78ae27fc294655b7 Mon Sep 17 00:00:00 2001 From: Anton Kindestam Date: Sat, 2 Jun 2018 12:53:47 +0200 Subject: context_drm_egl: Fix some memory leaks on error exit Fix some memory leaks on error exit in crtc_setup_atomic and crtc_release_atomic. --- video/out/opengl/context_drm_egl.c | 129 +++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 63 deletions(-) diff --git a/video/out/opengl/context_drm_egl.c b/video/out/opengl/context_drm_egl.c index 1ba7f5dd05..c101a5b809 100644 --- a/video/out/opengl/context_drm_egl.c +++ b/video/out/opengl/context_drm_egl.c @@ -253,52 +253,54 @@ static bool crtc_setup_atomic(struct ra_ctx *ctx) struct drm_atomic_context *atomic_ctx = p->kms->atomic_context; drmModeAtomicReqPtr request = drmModeAtomicAlloc(); - if (request) { - if (drm_object_set_property(request, atomic_ctx->connector, "CRTC_ID", p->kms->crtc_id) < 0) { - MP_ERR(ctx->vo, "Could not set CRTC_ID on connector\n"); - return false; - } - - uint32_t blob_id; - if (drmModeCreatePropertyBlob(p->kms->fd, &p->kms->mode, sizeof(drmModeModeInfo), - &blob_id) != 0) { - MP_ERR(ctx->vo, "Failed to create DRM mode blob\n"); - return false; - } - if (drm_object_set_property(request, atomic_ctx->crtc, "MODE_ID", blob_id) < 0) { - MP_ERR(ctx->vo, "Could not set MODE_ID on crtc\n"); - return false; - } - if (drm_object_set_property(request, atomic_ctx->crtc, "ACTIVE", 1) < 0) { - MP_ERR(ctx->vo, "Could not set ACTIVE on crtc\n"); - return false; - } - - drm_object_set_property(request, atomic_ctx->osd_plane, "FB_ID", p->fb->id); - drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_ID", p->kms->crtc_id); - drm_object_set_property(request, atomic_ctx->osd_plane, "SRC_X", 0); - drm_object_set_property(request, atomic_ctx->osd_plane, "SRC_Y", 0); - drm_object_set_property(request, atomic_ctx->osd_plane, "SRC_W", p->osd_size.width << 16); - drm_object_set_property(request, atomic_ctx->osd_plane, "SRC_H", p->osd_size.height << 16); - drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_X", 0); - drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_Y", 0); - drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_W", p->kms->mode.hdisplay); - drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_H", p->kms->mode.vdisplay); - - int ret = drmModeAtomicCommit(p->kms->fd, request, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); - if (ret) { - MP_ERR(ctx->vo, "Failed to commit ModeSetting atomic request (%d)\n", ret); - drmModeAtomicFree(request); - return false; - } - - drmModeAtomicFree(request); - - return ret == 0; - } else { + if (!request) { MP_ERR(ctx->vo, "Failed to allocate drm atomic request\n"); + return false; } + if (drm_object_set_property(request, atomic_ctx->connector, "CRTC_ID", p->kms->crtc_id) < 0) { + MP_ERR(ctx->vo, "Could not set CRTC_ID on connector\n"); + return false; + } + + uint32_t blob_id = 0; + if (drmModeCreatePropertyBlob(p->kms->fd, &p->kms->mode, sizeof(drmModeModeInfo), + &blob_id) != 0) { + MP_ERR(ctx->vo, "Failed to create DRM mode blob\n"); + blob_id = 0; + goto err; + } + if (drm_object_set_property(request, atomic_ctx->crtc, "MODE_ID", blob_id) < 0) { + MP_ERR(ctx->vo, "Could not set MODE_ID on crtc\n"); + goto err; + } + if (drm_object_set_property(request, atomic_ctx->crtc, "ACTIVE", 1) < 0) { + MP_ERR(ctx->vo, "Could not set ACTIVE on crtc\n"); + goto err; + } + + drm_object_set_property(request, atomic_ctx->osd_plane, "FB_ID", p->fb->id); + drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_ID", p->kms->crtc_id); + drm_object_set_property(request, atomic_ctx->osd_plane, "SRC_X", 0); + drm_object_set_property(request, atomic_ctx->osd_plane, "SRC_Y", 0); + drm_object_set_property(request, atomic_ctx->osd_plane, "SRC_W", p->osd_size.width << 16); + drm_object_set_property(request, atomic_ctx->osd_plane, "SRC_H", p->osd_size.height << 16); + drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_X", 0); + drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_Y", 0); + drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_W", p->kms->mode.hdisplay); + drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_H", p->kms->mode.vdisplay); + + int ret = drmModeAtomicCommit(p->kms->fd, request, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); + if (ret) + MP_ERR(ctx->vo, "Failed to commit ModeSetting atomic request (%d)\n", ret); + + drmModeAtomicFree(request); + return ret == 0; + + err: + if (blob_id) + drmModeDestroyPropertyBlob(p->kms->fd, blob_id); + drmModeAtomicFree(request); return false; } @@ -308,31 +310,32 @@ static bool crtc_release_atomic(struct ra_ctx *ctx) struct drm_atomic_context *atomic_ctx = p->kms->atomic_context; drmModeAtomicReqPtr request = drmModeAtomicAlloc(); - if (request) { - drm_object_set_property(request, atomic_ctx->connector, "CRTC_ID", p->old_crtc->crtc_id); - - uint32_t blob_id; - if (drmModeCreatePropertyBlob(p->kms->fd, &p->old_crtc->mode, sizeof(drmModeModeInfo), - &blob_id) != 0) { - MP_ERR(ctx->vo, "Failed to create DRM mode blob\n"); - return false; - } - drm_object_set_property(request, atomic_ctx->crtc, "MODE_ID", blob_id); - drm_object_set_property(request, atomic_ctx->crtc, "ACTIVE", 1); - drm_object_set_property(request, atomic_ctx->osd_plane, "FB_ID", p->old_crtc->buffer_id); + if (!request) { + MP_ERR(ctx->vo, "Failed to allocate drm atomic request\n"); + return false; + } + drm_object_set_property(request, atomic_ctx->connector, "CRTC_ID", p->old_crtc->crtc_id); - int ret = drmModeAtomicCommit(p->kms->fd, request, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); + uint32_t blob_id; + if (drmModeCreatePropertyBlob(p->kms->fd, &p->old_crtc->mode, sizeof(drmModeModeInfo), + &blob_id) != 0) { + MP_ERR(ctx->vo, "Failed to create DRM mode blob\n"); + goto err; + } + drm_object_set_property(request, atomic_ctx->crtc, "MODE_ID", blob_id); + drm_object_set_property(request, atomic_ctx->crtc, "ACTIVE", 1); + drm_object_set_property(request, atomic_ctx->osd_plane, "FB_ID", p->old_crtc->buffer_id); - if (ret) - MP_WARN(ctx->vo, "Failed to commit ModeSetting atomic request (%d)\n", ret); + int ret = drmModeAtomicCommit(p->kms->fd, request, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); - drmModeAtomicFree(request); + if (ret) + MP_WARN(ctx->vo, "Failed to commit ModeSetting atomic request (%d)\n", ret); - return ret == 0; - } else { - MP_ERR(ctx->vo, "Failed to allocate drm atomic request\n"); - } + drmModeAtomicFree(request); + return ret == 0; + err: + drmModeAtomicFree(request); return false; } -- cgit v1.2.3