Browse Source

Linux: Fix memory leak when inotify init failed

This introduces regex_compiled boolean to track whether the regex is
compiled successfully.

Closes #2229
Michael Skec 1 year ago
parent
commit
c992226a9c
2 changed files with 7 additions and 2 deletions
  1. 6 2
      src/linux_joystick.c
  2. 1 0
      src/linux_joystick.h

+ 6 - 2
src/linux_joystick.c

@@ -326,7 +326,9 @@ GLFWbool _glfwInitJoysticksLinux(void)
 
     // Continue without device connection notifications if inotify fails
 
-    if (regcomp(&_glfw.linjs.regex, "^event[0-9]\\+$", 0) != 0)
+    _glfw.linjs.regex_compiled = regcomp(&_glfw.linjs.regex,
+                                         "^event[0-9]\\+$", 0) == 0;
+    if (!_glfw.linjs.regex_compiled)
     {
         _glfwInputError(GLFW_PLATFORM_ERROR, "Linux: Failed to compile regex");
         return GLFW_FALSE;
@@ -378,8 +380,10 @@ void _glfwTerminateJoysticksLinux(void)
             inotify_rm_watch(_glfw.linjs.inotify, _glfw.linjs.watch);
 
         close(_glfw.linjs.inotify);
-        regfree(&_glfw.linjs.regex);
     }
+
+    if (_glfw.linjs.regex_compiled)
+        regfree(&_glfw.linjs.regex);
 }
 
 GLFWbool _glfwPollJoystickLinux(_GLFWjoystick* js, int mode)

+ 1 - 0
src/linux_joystick.h

@@ -50,6 +50,7 @@ typedef struct _GLFWlibraryLinux
     int                     inotify;
     int                     watch;
     regex_t                 regex;
+    GLFWbool                regex_compiled;
     GLFWbool                dropped;
 } _GLFWlibraryLinux;