From 7a52c7d720398da7df242aeef7be652b54290e94 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Mon, 18 Nov 2019 12:07:11 +0200 Subject: fbs: check params and ensure drmModeAddFB2 is passed correctly sized arrays Check that parameter vectors are of the same size, and match the number of planes. Extend the vectors to 4, as drmModeAddFB2() expects to get arrays of 4 elements. Signed-off-by: Tomi Valkeinen Reported-by: Matt Hoosier --- kms++/src/dmabufframebuffer.cpp | 5 +++++ kms++/src/extframebuffer.cpp | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/kms++/src/dmabufframebuffer.cpp b/kms++/src/dmabufframebuffer.cpp index 00ab94e..feac116 100644 --- a/kms++/src/dmabufframebuffer.cpp +++ b/kms++/src/dmabufframebuffer.cpp @@ -28,6 +28,9 @@ DmabufFramebuffer::DmabufFramebuffer(Card& card, uint32_t width, uint32_t height m_num_planes = format_info.num_planes; + if (fds.size() != m_num_planes || pitches.size() != m_num_planes || offsets.size() != m_num_planes) + throw std::invalid_argument("the size of fds, pitches and offsets has to match number of planes"); + for (int i = 0; i < format_info.num_planes; ++i) { FramebufferPlane& plane = m_planes[i]; @@ -45,6 +48,8 @@ DmabufFramebuffer::DmabufFramebuffer(Card& card, uint32_t width, uint32_t height uint32_t id; uint32_t bo_handles[4] = { m_planes[0].handle, m_planes[1].handle, m_planes[2].handle, m_planes[3].handle }; + pitches.resize(4); + offsets.resize(4); r = drmModeAddFB2(card.fd(), width, height, (uint32_t)format, bo_handles, pitches.data(), offsets.data(), &id, 0); if (r) diff --git a/kms++/src/extframebuffer.cpp b/kms++/src/extframebuffer.cpp index 28cc138..9f7ab6c 100644 --- a/kms++/src/extframebuffer.cpp +++ b/kms++/src/extframebuffer.cpp @@ -24,6 +24,9 @@ ExtFramebuffer::ExtFramebuffer(Card& card, uint32_t width, uint32_t height, Pixe m_num_planes = format_info.num_planes; + if (handles.size() != m_num_planes || pitches.size() != m_num_planes || offsets.size() != m_num_planes) + throw std::invalid_argument("the size of handles, pitches and offsets has to match number of planes"); + for (int i = 0; i < format_info.num_planes; ++i) { FramebufferPlane& plane = m_planes[i]; @@ -36,6 +39,9 @@ ExtFramebuffer::ExtFramebuffer(Card& card, uint32_t width, uint32_t height, Pixe } uint32_t id; + handles.resize(4); + pitches.resize(4); + offsets.resize(4); int r = drmModeAddFB2(card.fd(), width, height, (uint32_t)format, handles.data(), pitches.data(), offsets.data(), &id, 0); if (r) throw std::invalid_argument(string("Failed to create ExtFramebuffer: ") + strerror(r)); -- cgit v1.2.3