Fix undefined behavior

Fixes #950.
This commit is contained in:
Camilla Löwy 2017-02-16 05:23:10 +01:00
parent f69829f7b4
commit 980f955f6c
3 changed files with 24 additions and 13 deletions

View File

@ -215,15 +215,20 @@ void _glfwPollMonitorsNS(void)
{ {
uint32_t i, j, displayCount, disconnectedCount; uint32_t i, j, displayCount, disconnectedCount;
CGDirectDisplayID* displays; CGDirectDisplayID* displays;
_GLFWmonitor** disconnected; _GLFWmonitor** disconnected = NULL;
CGGetOnlineDisplayList(0, NULL, &displayCount); CGGetOnlineDisplayList(0, NULL, &displayCount);
displays = calloc(displayCount, sizeof(CGDirectDisplayID)); displays = calloc(displayCount, sizeof(CGDirectDisplayID));
CGGetOnlineDisplayList(displayCount, displays, &displayCount); CGGetOnlineDisplayList(displayCount, displays, &displayCount);
disconnectedCount = _glfw.monitorCount; disconnectedCount = _glfw.monitorCount;
disconnected = calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*)); if (disconnectedCount)
memcpy(disconnected, _glfw.monitors, _glfw.monitorCount * sizeof(_GLFWmonitor*)); {
disconnected = calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*));
memcpy(disconnected,
_glfw.monitors,
_glfw.monitorCount * sizeof(_GLFWmonitor*));
}
for (i = 0; i < displayCount; i++) for (i = 0; i < displayCount; i++)
{ {

View File

@ -91,16 +91,19 @@ static _GLFWmonitor* createMonitor(DISPLAY_DEVICEW* adapter,
void _glfwPollMonitorsWin32(void) void _glfwPollMonitorsWin32(void)
{ {
int i, disconnectedCount; int i, disconnectedCount;
_GLFWmonitor** disconnected; _GLFWmonitor** disconnected = NULL;
DWORD adapterIndex, displayIndex; DWORD adapterIndex, displayIndex;
DISPLAY_DEVICEW adapter, display; DISPLAY_DEVICEW adapter, display;
GLFWbool hasDisplays = GLFW_FALSE; GLFWbool hasDisplays = GLFW_FALSE;
disconnectedCount = _glfw.monitorCount; disconnectedCount = _glfw.monitorCount;
disconnected = calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*)); if (disconnectedCount)
memcpy(disconnected, {
_glfw.monitors, disconnected = calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*));
_glfw.monitorCount * sizeof(_GLFWmonitor*)); memcpy(disconnected,
_glfw.monitors,
_glfw.monitorCount * sizeof(_GLFWmonitor*));
}
// HACK: Check if any active adapters have connected displays // HACK: Check if any active adapters have connected displays
// If not, this is a headless system or a VMware guest // If not, this is a headless system or a VMware guest

View File

@ -102,7 +102,7 @@ void _glfwPollMonitorsX11(void)
if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken) if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken)
{ {
int i, j, disconnectedCount, screenCount = 0; int i, j, disconnectedCount, screenCount = 0;
_GLFWmonitor** disconnected; _GLFWmonitor** disconnected = NULL;
XineramaScreenInfo* screens = NULL; XineramaScreenInfo* screens = NULL;
XRRScreenResources* sr = XRRGetScreenResourcesCurrent(_glfw.x11.display, XRRScreenResources* sr = XRRGetScreenResourcesCurrent(_glfw.x11.display,
_glfw.x11.root); _glfw.x11.root);
@ -113,10 +113,13 @@ void _glfwPollMonitorsX11(void)
screens = XineramaQueryScreens(_glfw.x11.display, &screenCount); screens = XineramaQueryScreens(_glfw.x11.display, &screenCount);
disconnectedCount = _glfw.monitorCount; disconnectedCount = _glfw.monitorCount;
disconnected = calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*)); if (disconnectedCount)
memcpy(disconnected, {
_glfw.monitors, disconnected = calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*));
_glfw.monitorCount * sizeof(_GLFWmonitor*)); memcpy(disconnected,
_glfw.monitors,
_glfw.monitorCount * sizeof(_GLFWmonitor*));
}
for (i = 0; i < sr->noutput; i++) for (i = 0; i < sr->noutput; i++)
{ {