[PATCH 02/11] xf86AutoConfig: make copyScreen memory allocation & error handling more sane

Alan Coopersmith alan.coopersmith at oracle.com
Mon Nov 29 20:57:39 PST 2010


No point calling the no-fail-alloc if you check for failure and your
only caller checks for failure.

No point calling calloc to zero fill memory you're about to memcpy over.

In the unlikely event of a loss of memory allocation, drop your previous
allocations before returning to others.

Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
---
 hw/xfree86/common/xf86AutoConfig.c |   20 +++++++++++++++-----
 1 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c
index 200cb8f..3cd5ef6 100644
--- a/hw/xfree86/common/xf86AutoConfig.c
+++ b/hw/xfree86/common/xf86AutoConfig.c
@@ -282,21 +282,31 @@ listPossibleVideoDrivers(char *matches[], int nmatches)
 static Bool
 copyScreen(confScreenPtr oscreen, GDevPtr odev, int i, char *driver)
 {
+    confScreenPtr nscreen;
     GDevPtr cptr = NULL;
 
-    xf86ConfigLayout.screens[i].screen = xnfcalloc(1, sizeof(confScreenRec));
-    if(!xf86ConfigLayout.screens[i].screen)
+    nscreen = malloc(sizeof(confScreenRec));
+    if (!nscreen)
         return FALSE;
-    memcpy(xf86ConfigLayout.screens[i].screen, oscreen, sizeof(confScreenRec));
+    memcpy(nscreen, oscreen, sizeof(confScreenRec));
 
-    cptr = calloc(1, sizeof(GDevRec));
-    if (!cptr)
+    cptr = malloc(sizeof(GDevRec));
+    if (!cptr) {
+        free(nscreen);
         return FALSE;
+    }
     memcpy(cptr, odev, sizeof(GDevRec));
 
     cptr->identifier = Xprintf("Autoconfigured Video Device %s", driver);
+    if (!cptr->identifier) {
+        free(cptr);
+        free(nscreen);
+        return FALSE;
+    }
     cptr->driver = driver;
 
+    xf86ConfigLayout.screens[i].screen = nscreen;
+
     /* now associate the new driver entry with the new screen entry */
     xf86ConfigLayout.screens[i].screen->device = cptr;
     cptr->myScreenSection = xf86ConfigLayout.screens[i].screen;
-- 
1.7.3.2



More information about the xorg-devel mailing list