1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-23 19:53:47 +00:00

Fixed bug in Windows KVM, where certain error conditions when fetching desktop buffer, returned a success instead of an error, potentially causing a segfault

This commit is contained in:
Bryan Roe
2020-01-09 13:54:02 -08:00
parent 85b487631a
commit eb257198e3
2 changed files with 7 additions and 6 deletions

View File

@@ -919,7 +919,7 @@ DWORD WINAPI kvm_server_mainloop_ex(LPVOID parm)
if (g_shutdown) break; if (g_shutdown) break;
// Scan the desktop // Scan the desktop
if (get_desktop_buffer(&desktop, &desktopsize) == 1) if (get_desktop_buffer(&desktop, &desktopsize) == 1 || desktop == NULL)
{ {
#ifdef _WINSERVICE #ifdef _WINSERVICE
if (!kvmConsoleMode) if (!kvmConsoleMode)

View File

@@ -491,10 +491,10 @@ int get_desktop_buffer(void **buffer, long long *bufferSize)
if ((hCapturedBitmap = CreateCompatibleBitmap(hDesktopDC, adjust_screen_size(SCALED_WIDTH), adjust_screen_size(SCALED_HEIGHT))) == NULL) if ((hCapturedBitmap = CreateCompatibleBitmap(hDesktopDC, adjust_screen_size(SCALED_WIDTH), adjust_screen_size(SCALED_HEIGHT))) == NULL)
{ {
KVMDEBUG("CreateCompatibleBitmap() returned NULL", 0); KVMDEBUG("CreateCompatibleBitmap() returned NULL", 0);
return 0; return 1;
} }
if (SelectObject(hCaptureDC, hCapturedBitmap) == NULL) { KVMDEBUG("SelectObject() failed", 0); } if (SelectObject(hCaptureDC, hCapturedBitmap) == NULL) { KVMDEBUG("SelectObject() failed", 0); return(1); }
if (SCALING_FACTOR == 1024) if (SCALING_FACTOR == 1024)
{ {
if (BitBlt(hCaptureDC, 0, 0, adjust_screen_size(SCREEN_WIDTH), adjust_screen_size(SCREEN_HEIGHT), hDesktopDC, SCREEN_X, SCREEN_Y, SRCCOPY | CAPTUREBLT) == FALSE) if (BitBlt(hCaptureDC, 0, 0, adjust_screen_size(SCREEN_WIDTH), adjust_screen_size(SCREEN_HEIGHT), hDesktopDC, SCREEN_X, SCREEN_Y, SRCCOPY | CAPTUREBLT) == FALSE)
@@ -505,7 +505,7 @@ int get_desktop_buffer(void **buffer, long long *bufferSize)
} }
else else
{ {
if (SetStretchBltMode(hCaptureDC, HALFTONE) == 0) { KVMDEBUG("SetStretchBltMode() failed", 0); } if (SetStretchBltMode(hCaptureDC, HALFTONE) == 0) { KVMDEBUG("SetStretchBltMode() failed", 0); return(1); }
if (StretchBlt(hCaptureDC, 0, 0, adjust_screen_size(SCALED_WIDTH), adjust_screen_size(SCALED_HEIGHT), hDesktopDC, SCREEN_X, SCREEN_Y, adjust_screen_size(SCREEN_WIDTH), adjust_screen_size(SCREEN_HEIGHT), SRCCOPY | CAPTUREBLT) == FALSE) if (StretchBlt(hCaptureDC, 0, 0, adjust_screen_size(SCALED_WIDTH), adjust_screen_size(SCALED_HEIGHT), hDesktopDC, SCREEN_X, SCREEN_Y, adjust_screen_size(SCREEN_WIDTH), adjust_screen_size(SCREEN_HEIGHT), SRCCOPY | CAPTUREBLT) == FALSE)
{ {
KVMDEBUG("StretchBlt() returned FALSE", 0); KVMDEBUG("StretchBlt() returned FALSE", 0);
@@ -521,6 +521,7 @@ int get_desktop_buffer(void **buffer, long long *bufferSize)
{ {
KVMDEBUG("GetDIBits() failed", 0); KVMDEBUG("GetDIBits() failed", 0);
ILibCriticalLog(NULL, __FILE__, __LINE__, 252, GetLastError()); ILibCriticalLog(NULL, __FILE__, __LINE__, 252, GetLastError());
return(1);
} }
if (bmpInfo.bmiHeader.biSizeImage <= 0) if (bmpInfo.bmiHeader.biSizeImage <= 0)
@@ -530,10 +531,10 @@ int get_desktop_buffer(void **buffer, long long *bufferSize)
*bufferSize = bmpInfo.bmiHeader.biSizeImage; *bufferSize = bmpInfo.bmiHeader.biSizeImage;
PIXEL_SIZE = bmpInfo.bmiHeader.biBitCount / 8; PIXEL_SIZE = bmpInfo.bmiHeader.biBitCount / 8;
if ((*buffer = malloc((size_t)*bufferSize)) == NULL) { KVMDEBUG("malloc() failed", 0); return 0; } if ((*buffer = malloc((size_t)*bufferSize)) == NULL) { KVMDEBUG("malloc() failed", 0); return 1; }
bmpInfo.bmiHeader.biCompression = BI_RGB; bmpInfo.bmiHeader.biCompression = BI_RGB;
if (GetDIBits(hDesktopDC, hCapturedBitmap, 0, bmpInfo.bmiHeader.biHeight, *buffer, &bmpInfo, DIB_RGB_COLORS) == 0) { KVMDEBUG("GetDIBits() failed", 0); } if (GetDIBits(hDesktopDC, hCapturedBitmap, 0, bmpInfo.bmiHeader.biHeight, *buffer, &bmpInfo, DIB_RGB_COLORS) == 0) { KVMDEBUG("GetDIBits() failed", 0); free(*buffer); return(1); }
return 0; return 0;
} }