glx: fix possible memory leaks in dri2CreateScreen()
authorRodolfo Ribeiro Gomes <rodolforg@gmail.com>
Fri, 29 Jan 2010 15:36:47 +0000 (08:36 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 29 Jan 2010 15:36:47 +0000 (08:36 -0700)
Original patch fixed up by Brian Paul.

src/glx/x11/dri2_glx.c

index 7b0c52b50d4cf38c970469a8a5b608f5880e14e4..222895814419a0b44d9bda99712ea15d1393a79c 100644 (file)
@@ -504,8 +504,10 @@ dri2CreateScreen(__GLXscreenConfigs * psc, int screen,
    psc->ext_list_first_time = GL_TRUE;
 
    if (!DRI2Connect(psc->dpy, RootWindow(psc->dpy, screen),
-                   &driverName, &deviceName))
+                   &driverName, &deviceName)) {
+      XFree(psp);
       return NULL;
+   }
 
    psc->driver = driOpenDriver(driverName);
    if (psc->driver == NULL) {
@@ -534,17 +536,17 @@ dri2CreateScreen(__GLXscreenConfigs * psc, int screen,
    psc->fd = open(deviceName, O_RDWR);
    if (psc->fd < 0) {
       ErrorMessageF("failed to open drm device: %s\n", strerror(errno));
-      return NULL;
+      goto handle_error;
    }
 
    if (drmGetMagic(psc->fd, &magic)) {
       ErrorMessageF("failed to get magic\n");
-      return NULL;
+      goto handle_error;
    }
 
    if (!DRI2Authenticate(psc->dpy, RootWindow(psc->dpy, screen), magic)) {
       ErrorMessageF("failed to authenticate magic %d\n", magic);
-      return NULL;
+      goto handle_error;
    }
 
    /* If the server does not support the protocol for
@@ -558,7 +560,7 @@ dri2CreateScreen(__GLXscreenConfigs * psc, int screen,
 
    if (psc->__driScreen == NULL) {
       ErrorMessageF("failed to create dri screen\n");
-      return NULL;
+      goto handle_error;
    }
 
    driBindCommonExtensions(psc);
@@ -602,6 +604,7 @@ dri2CreateScreen(__GLXscreenConfigs * psc, int screen,
 handle_error:
    Xfree(driverName);
    Xfree(deviceName);
+   XFree(psp);
 
    /* FIXME: clean up here */