Browse Source

Fix undefined behavior

Fixes #950.
Camilla Löwy 8 years ago
parent
commit
980f955f6c
3 changed files with 24 additions and 13 deletions
  1. 8 3
      src/cocoa_monitor.m
  2. 8 5
      src/win32_monitor.c
  3. 8 5
      src/x11_monitor.c

+ 8 - 3
src/cocoa_monitor.m

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

+ 8 - 5
src/win32_monitor.c

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

+ 8 - 5
src/x11_monitor.c

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