From db6fc2948cc57482c48ae20d1cf4f770943851b1 Mon Sep 17 00:00:00 2001 From: Dalton Messmer Date: Sun, 28 Sep 2025 00:25:10 -0400 Subject: [PATCH] Fix null pointer deref when getting VST window size (#8051) * Fix null pointer deref when getting VST window size --- plugins/VstBase/RemoteVstPlugin.cpp | 52 ++++++++++++++++++----------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/plugins/VstBase/RemoteVstPlugin.cpp b/plugins/VstBase/RemoteVstPlugin.cpp index 0645cb5de..0a7680094 100644 --- a/plugins/VstBase/RemoteVstPlugin.cpp +++ b/plugins/VstBase/RemoteVstPlugin.cpp @@ -813,16 +813,24 @@ void RemoteVstPlugin::initEditor() pluginDispatch( effEditOpen, 0, 0, m_window ); ERect* er = nullptr; - pluginDispatch( effEditGetRect, 0, 0, &er ); + pluginDispatch(effEditGetRect, 0, 0, &er); - m_windowWidth = er->right - er->left; - m_windowHeight = er->bottom - er->top; + if (er) + { + assert(er->right > er->left); + m_windowWidth = er->right - er->left; + assert(er->bottom > er->top); + m_windowHeight = er->bottom - er->top; + + RECT windowSize = { 0, 0, m_windowWidth, m_windowHeight }; + AdjustWindowRect(&windowSize, dwStyle, false); + SetWindowPos(m_window, 0, 0, 0, + windowSize.right - windowSize.left, + windowSize.bottom - windowSize.top, + SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER + ); + } - RECT windowSize = { 0, 0, m_windowWidth, m_windowHeight }; - AdjustWindowRect( &windowSize, dwStyle, false ); - SetWindowPos( m_window, 0, 0, 0, windowSize.right - windowSize.left, - windowSize.bottom - windowSize.top, SWP_NOACTIVATE | - SWP_NOMOVE | SWP_NOZORDER ); pluginDispatch( effEditTop ); #ifdef LMMS_BUILD_LINUX @@ -834,36 +842,42 @@ void RemoteVstPlugin::initEditor() #else Atom prop_atom, val_atom; - + if (m_display == nullptr) { m_display = XOpenDisplay(nullptr); } m_window = XCreateSimpleWindow(m_display, DefaultRootWindow(m_display), 0, 0, 400, 400, 0, 0, 0); - + m_wmDeleteMessage = XInternAtom(m_display, "WM_DELETE_WINDOW", false); XSetWMProtocols(m_display, m_window, &m_wmDeleteMessage, 1); - + // make tool window prop_atom = XInternAtom(m_display, "_NET_WM_WINDOW_TYPE", False); val_atom = XInternAtom(m_display, "_NET_WM_WINDOW_TYPE_DIALOG", False); XChangeProperty(m_display, m_window, prop_atom, XA_ATOM, 32, PropModeReplace, (unsigned char *)&val_atom, 1); - + // change name XStoreName(m_display, m_window, pluginName()); - + ERect* er = nullptr; pluginDispatch(effEditGetRect, 0, 0, &er); - m_windowWidth = er->right - er->left; - m_windowHeight = er->bottom - er->top; - XResizeWindow(m_display, m_window, m_windowWidth, m_windowHeight); - + if (er) + { + assert(er->right > er->left); + m_windowWidth = er->right - er->left; + assert(er->bottom > er->top); + m_windowHeight = er->bottom - er->top; + XResizeWindow(m_display, m_window, + static_cast(m_windowWidth), static_cast(m_windowHeight)); + } + XMapWindow(m_display, m_window); XFlush(m_display); - + pluginDispatch(effEditOpen, 0, (intptr_t) m_display, (void*) m_window); - + XSelectInput(m_display, m_window, SubstructureNotifyMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | ExposureMask | KeyPressMask);