Prefs: fix memleaks (again...) 50/13950/3
Calixte DENIZET [Fri, 7 Mar 2014 10:52:19 +0000 (11:52 +0100)]
Change-Id: Ibd26b813b45e3e82edeee677f5e31fac846eaafd

scilab/modules/core/src/c/saveCWDInPreferences.c
scilab/modules/preferences/src/c/getScilabPreference.c

index 2e7b836..71989e5 100644 (file)
@@ -22,16 +22,26 @@ void saveCWDInPreferences()
     const char * keys[] = {"use", "previous"};
     char ** values = getPrefAttributesValues("//general/body/startup", keys, sizeof(keys) / sizeof(const char *));
 
-    if (values && values[0] && stricmp(values[0], "previous") == 0)
+    if (values)
     {
-        int err;
-        char * cwd = scigetcwd(&err);
-
-        if (!err && cwd && strcmp(cwd, values[1]))
+        if (values[0] && stricmp(values[0], "previous") == 0)
         {
-            const char * kv[] = {"previous", cwd};
-            setPrefAttributesValues("//general/body/startup", kv, sizeof(kv) / sizeof(const char *));
-            FREE(cwd);
+            int err;
+            char * cwd = scigetcwd(&err);
+
+            if (!err && cwd && strcmp(cwd, values[1]))
+            {
+                const char * kv[] = {"previous", cwd};
+                setPrefAttributesValues("//general/body/startup", kv, sizeof(kv) / sizeof(const char *));
+            }
+
+            if (cwd)
+            {
+                FREE(cwd);
+            }
         }
+        FREE(values[0]);
+        FREE(values[1]);
+        FREE(values);
     }
 }
index 20cc955..2e11d88 100644 (file)
@@ -248,33 +248,36 @@ char * getPrefAttributeValue(const char * xpath, const char * attribute)
     xmlDocPtr doc = NULL;
     xmlXPathContextPtr xpathCtxt = NULL;
     char * ret = NULL;
-
     unsigned int xlen = 0;
     unsigned int alen = 0;
-    char * query = (char *)MALLOC((xlen + alen + 2 + 1) * sizeof(char));
+    char * query = NULL;
 
     if (!xpath || !attribute)
     {
         return NULL;
     }
 
+    query = (char *)MALLOC((xlen + alen + 2 + 1) * sizeof(char));
+    if (!query)
+    {
+        return NULL;
+    }
+
     xlen = (unsigned int) strlen(xpath);
     alen = (unsigned int) strlen(attribute);
 
     getDocAndCtxt(&doc, &xpathCtxt);
     if (doc == NULL)
     {
+        FREE(query);
         return NULL;
     }
 
-    if (query)
-    {
-        sprintf(query, "%s/@%s", xpath, attribute);
-        query[xlen + alen + 2] = '\0';
+    sprintf(query, "%s/@%s", xpath, attribute);
+    query[xlen + alen + 2] = '\0';
 
-        ret = strdup(getAttribute(doc, xpathCtxt, (const xmlChar*)query));
-        FREE(query);
-    }
+    ret = strdup(getAttribute(doc, xpathCtxt, (const xmlChar*)query));
+    FREE(query);
 
     xmlXPathFreeContext(xpathCtxt);
     xmlFreeDoc(doc);