[fusion-commits] Compiz configuration system library: Changes to 'master' (3813eec333d40304cbd256652c5b67b719183b51)

maniac at server.beryl-project.org maniac at server.beryl-project.org
Thu Aug 2 15:57:13 CEST 2007


New commits:
commit 3813eec333d40304cbd256652c5b67b719183b51
Author: Danny Baumann <dannybaumann at web.de>
Date:   Thu Aug 2 15:56:30 2007 +0200

    Added proper NULL checks for malloc return values.

commit 75cff54c6b788b0fff45f23998cc20920c8d1f7d
Author: Danny Baumann <dannybaumann at web.de>
Date:   Thu Aug 2 11:30:27 2007 +0200

    Also check if environment variables contain a valid string.

commit 2c45acafc61058db84ff7e51c74d5f21e1156f7b
Author: Danny Baumann <dannybaumann at web.de>
Date:   Thu Aug 2 11:27:20 2007 +0200

    Keep usual config directory (~/.compizconfig) if no XDG home directory was found.

commit 71c3557c40a89f321da9e4e8fa5e03df4d5c6976
Author: Danny Baumann <dannybaumann at web.de>
Date:   Thu Aug 2 11:16:36 2007 +0200

    Coding style adjustments.

commit 8ba669043b717b76c48a686d96fc356ba079defe
Author: Danny Baumann <dannybaumann at web.de>
Date:   Thu Aug 2 11:15:01 2007 +0200

    Fix typo.

commit 601a794e83352d416362399555db1ac1bea90033
Author: Christopher James Halse Rogers <chris at Burninator.(none)>
Date:   Thu Aug 2 11:14:40 2007 +0200

    Make libcompizconfig comply to XDG spec.


 backend/ini.c   |   23 +++++--
 include/ccs.h   |    3 -
 plugin/ccp.c    |   26 +++++--
 src/compiz.c    |  166 +++++++++++++++++++++++++++++-------------
 src/config.c    |   23 +++++--
 src/filewatch.c |   10 +++
 src/ini.c       |   80 +++++++++++++++------
 src/iniparser.c |   30 ++++++++-
 src/lists.c     |  101 +++++++++++++++++++++-----
 src/main.c      |  214 ++++++++++++++++++++++++++++++++++++++++---------------
 10 files changed, 502 insertions(+), 174 deletions(-)


Modified: fusion/compizconfig/libcompizconfig/backend/ini.c
===================================================================
--- fusion/compizconfig/libcompizconfig/backend/ini.c
+++ fusion/compizconfig/libcompizconfig/backend/ini.c
@@ -37,7 +37,8 @@
 #include <X11/Xlib.h>
 
 #define DEFAULTPROF "Default"
-#define SETTINGPATH ".compizconfig/"
+#define SETTINGPATH ".compizconfig"
+#define XDG_SETTINGPATH "compiz/compizconfig"
 
 typedef struct _IniPrivData
 {
@@ -75,15 +76,25 @@ findPrivFromContext (CCSContext *context)
 static char*
 getIniFileName (char *profile)
 {
-    char *homeDir = NULL;
+    char *configDir = NULL;
     char *fileName = NULL;
+    char *settingPath;
 
-    homeDir = getenv ("HOME");
+    configDir = getenv ("XDG_CONFIG_HOME");
+    if (!configDir || !strlen (configDir))
+    {
+	configDir = getenv ("HOME");
+	if (!configDir || !strlen (configDir))
+	    return NULL;
 
-    if (!homeDir)
-	return NULL;
+	settingPath = SETTINGPATH;
+    }
+    else
+    {
+	settingPath = XDG_SETTINGPATH;
+    }
 
-    asprintf (&fileName, "%s/%s%s.ini", homeDir, SETTINGPATH, profile);
+    asprintf (&fileName, "%s/%s/%s.ini", configDir, settingPath, profile);
 
     return fileName;
 }

Modified: fusion/compizconfig/libcompizconfig/include/ccs.h
===================================================================
--- fusion/compizconfig/libcompizconfig/include/ccs.h
+++ fusion/compizconfig/libcompizconfig/include/ccs.h
@@ -35,9 +35,6 @@
 #define FALSE 0
 #endif
 
-#define NEW(a,b) \
-    a * b = malloc(sizeof(a)); memset((b),0,sizeof(a))
-
 #define CCSLIST_HDR(type,dtype)		\
     typedef struct _CCS##type##List *	CCS##type##List;\
     struct _CCS##type##List	\

Modified: fusion/compizconfig/libcompizconfig/plugin/ccp.c
===================================================================
--- fusion/compizconfig/libcompizconfig/plugin/ccp.c
+++ fusion/compizconfig/libcompizconfig/plugin/ccp.c
@@ -241,7 +241,12 @@ ccpValueToSetting (CompDisplay     *d,
 		   CCSSetting      *s,
 		   CompOptionValue *v)
 {
-    NEW (CCSSettingValue, value);
+    CCSSettingValue *value;
+
+    value = malloc (sizeof (CCSSettingValue));
+    if (!value)
+	return;
+
     value->parent = s;
 
     if (s->type == TypeList)
@@ -250,13 +255,18 @@ ccpValueToSetting (CompDisplay     *d,
 
 	for (i = 0; i < v->list.nValue; i++)
 	{
-	    NEW (CCSSettingValue, val);
-	    val->parent = s;
-	    val->isListChild = TRUE;
-	    ccpInitValue (d, val, &v->list.value[i],
-			  s->info.forList.listType);
-	    value->value.asList =
-		ccsSettingValueListAppend (value->value.asList, val);
+	    CCSSettingValue *val;
+
+	    val = malloc (sizeof (CCSSettingValue));
+	    if (val)
+	    {
+		val->parent = s;
+		val->isListChild = TRUE;
+		ccpInitValue (d, val, &v->list.value[i],
+			      s->info.forList.listType);
+		value->value.asList =
+		    ccsSettingValueListAppend (value->value.asList, val);
+	    }
 	}
     }
     else

Modified: fusion/compizconfig/libcompizconfig/src/compiz.c
===================================================================
--- fusion/compizconfig/libcompizconfig/src/compiz.c
+++ fusion/compizconfig/libcompizconfig/src/compiz.c
@@ -232,6 +232,8 @@ getNodesFromXPath (xmlDoc * doc, xmlNode * base, char *path, int *num)
 
     *num = size;
     rv = malloc (size * sizeof (xmlNode *));
+    if (!rv)
+	return NULL;
 
     for (i = 0; i < size; i++)
 	rv[i] = xpathObj->nodesetval->nodeTab[i];
@@ -701,7 +703,11 @@ initListValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node)
     {
 	for (j = 0; j < num; j++)
 	{
-	    NEW (CCSSettingValue, val);
+	    CCSSettingValue *val;
+	    val = malloc (sizeof (CCSSettingValue));
+	    if (!val)
+		continue;
+
 	    val->parent = v->parent;
 	    val->isListChild = TRUE;
 
@@ -783,12 +789,18 @@ initIntInfo (CCSSettingInfo * i, xmlNode * node)
 							NULL);
 			if (value)
 			{
-			    NEW (CCSIntDesc, intDesc);
-			    intDesc->name = strdup (value);
-			    intDesc->value = val;
-			    i->forInt.desc =
-				ccsIntDescListAppend (i->forInt.desc, intDesc);
-			    free (value);
+			    CCSIntDesc *intDesc;
+
+			    intDesc = malloc (sizeof (CCSIntDesc));
+			    if (intDesc)
+			    {
+				intDesc->name = strdup (value);
+				intDesc->value = val;
+				i->forInt.desc =
+				    ccsIntDescListAppend (i->forInt.desc,
+							  intDesc);
+				free (value);
+			    }
 			}
 		    }
 		}
@@ -896,6 +908,7 @@ static void
 initListInfo (CCSSettingInfo * i, xmlNode * node)
 {
     char *value;
+    CCSSettingInfo *info;
 
     i->forList.listType = TypeBool;
     i->forList.listInfo = NULL;
@@ -913,22 +926,25 @@ initListInfo (CCSSettingInfo * i, xmlNode * node)
     {
     case TypeInt:
 	{
-	    NEW (CCSSettingInfo, info);
-	    initIntInfo (info, node);
+	    info = malloc (sizeof (CCSSettingInfo));
+	    if (info)
+		initIntInfo (info, node);
 	    i->forList.listInfo = info;
 	}
 	break;
     case TypeFloat:
 	{
-	    NEW (CCSSettingInfo, info);
-	    initFloatInfo (info, node);
+	    info = malloc (sizeof (CCSSettingInfo));
+	    if (info)
+		initFloatInfo (info, node);
 	    i->forList.listInfo = info;
 	}
 	break;
     case TypeAction:
 	{
-	    NEW (CCSSettingInfo, info);
-	    initActionInfo (info, node);
+	    info = malloc (sizeof (CCSSettingInfo));
+	    if (info)
+		initActionInfo (info, node);
 	    i->forList.listInfo = info;
 	}
 	break;
@@ -1120,6 +1136,7 @@ addOptionForPlugin (CCSPlugin * plugin,
 {
     xmlNode **nodes;
     int num = 0;
+    CCSSetting *setting;
 
     if (ccsFindSetting (plugin, name, isScreen, screen))
     {
@@ -1127,7 +1144,9 @@ addOptionForPlugin (CCSPlugin * plugin,
 	return;
     }
 
-    NEW (CCSSetting, setting);
+    setting = malloc (sizeof (CCSSetting));
+    if (!setting)
+	return;
 
     setting->parent = plugin;
     setting->isScreen = isScreen;
@@ -1352,6 +1371,8 @@ static void
 addPluginFromXMLNode (CCSContext * context, xmlNode * node, char *file)
 {
     char *name;
+    CCSPlugin *plugin;
+    CCSPluginPrivate *pPrivate;
 
     if (!node)
 	return;
@@ -1377,9 +1398,17 @@ addPluginFromXMLNode (CCSContext * context, xmlNode * node, char *file)
 	return;
     }
 
+    plugin = malloc (sizeof (CCSPlugin));
+    if (!plugin)
+	return;
+
+    pPrivate = malloc (sizeof (CCSPluginPrivate));
+    if (!pPrivate)
+    {
+	free (plugin);
+	return;
+    }
 
-    NEW (CCSPlugin, plugin);
-    NEW (CCSPluginPrivate, pPrivate);
     plugin->ccsPrivate = (void *) pPrivate;
 
     if (file)
@@ -1409,26 +1438,32 @@ addPluginFromXMLNode (CCSContext * context, xmlNode * node, char *file)
     printf ("Adding plugin %s (%s)\n", name, plugin->shortDesc);
 
     char *def = NULL;
-    NEW (CCSSetting, setting);
+    CCSSetting *setting;
 
-    setting->parent = plugin;
-    setting->isScreen = FALSE;
-    setting->screenNum = 0;
-    setting->isDefault = TRUE;
-    setting->name = strdup ("____plugin_enabled");
-    setting->shortDesc = strdup ("enabled");
-    setting->longDesc = strdup ("enabled");
-    setting->group = strdup ("");
-    setting->subGroup = strdup ("");
-    setting->type = TypeBool;
-    setting->defaultValue.parent = setting;
-    def = stringFromNodeDef (node, "autoenable/child::text()", "false");
-    setting->defaultValue.value.asBool = (strcmp (def, "true")) ? FALSE : TRUE;
-    free (def);
+    setting = malloc (sizeof (CCSSetting));
+    if (setting)
+    {
+    	setting->parent = plugin;
+	setting->isScreen = FALSE;
+	setting->screenNum = 0;
+	setting->isDefault = TRUE;
+	setting->name = strdup ("____plugin_enabled");
+	setting->shortDesc = strdup ("enabled");
+	setting->longDesc = strdup ("enabled");
+	setting->group = strdup ("");
+	setting->subGroup = strdup ("");
+	setting->type = TypeBool;
+	setting->defaultValue.parent = setting;
+	def = stringFromNodeDef (node, "autoenable/child::text()", "false");
+	setting->defaultValue.value.asBool = 
+	    (strcmp (def, "true")) ? FALSE : TRUE;
+	free (def);
 
-    setting->value = &setting->defaultValue;
+	setting->value = &setting->defaultValue;
+
+	pPrivate->settings = ccsSettingListAppend (pPrivate->settings, setting);
+    }
 
-    pPrivate->settings = ccsSettingListAppend (pPrivate->settings, setting);
     context->plugins = ccsPluginListAppend (context->plugins, plugin);
     free (name);
 }
@@ -1436,14 +1471,26 @@ addPluginFromXMLNode (CCSContext * context, xmlNode * node, char *file)
 static void
 addCoreSettingsFromXMLNode (CCSContext * context, xmlNode * node, char *file)
 {
+    CCSPlugin *plugin;
+    CCSPluginPrivate *pPrivate;
+
     if (!node)
 	return;
 
     if (ccsFindPlugin (context, "core"))
 	return;
 
-    NEW (CCSPlugin, plugin);
-    NEW (CCSPluginPrivate, pPrivate);
+    plugin = malloc (sizeof (CCSPlugin));
+    if (!plugin)
+	return;
+
+    pPrivate = malloc (sizeof (CCSPluginPrivate));
+    if (!pPrivate)
+    {
+	free (plugin);
+	return;
+    }
+
     plugin->ccsPrivate = (void *) pPrivate;
 
     if (file)
@@ -1573,6 +1620,9 @@ loadPluginsFromXMLFiles (CCSContext * context, char *path)
 static void
 addPluginNamed (CCSContext * context, char *name)
 {
+    CCSPlugin *plugin;
+    CCSPluginPrivate *pPrivate;
+    CCSSetting *setting;
 
     if (ccsFindPlugin (context, name))
 	return;
@@ -1601,8 +1651,17 @@ addPluginNamed (CCSContext * context, char *name)
 	}
     }
 
-    NEW (CCSPlugin, plugin);
-    NEW (CCSPluginPrivate, pPrivate);
+    plugin = malloc (sizeof (CCSPlugin));
+    if (!plugin)
+	return;
+
+    pPrivate = malloc (sizeof (CCSPluginPrivate));
+    if (!pPrivate)
+    {
+	free (plugin);
+	return;
+    }
+
     plugin->ccsPrivate = (void *) pPrivate;
 
     plugin->context = context;
@@ -1617,22 +1676,25 @@ addPluginNamed (CCSContext * context, char *name)
     if (!plugin->category)
 	plugin->category = strdup ("");
 
-    NEW (CCSSetting, setting);
+    setting = malloc (sizeof (CCSSetting));
+    if (setting)
+    {
+    	setting->parent = plugin;
+	setting->isScreen = FALSE;
+	setting->screenNum = 0;
+	setting->isDefault = TRUE;
+	setting->name = strdup ("____plugin_enabled");
+	setting->shortDesc = strdup ("enabled");
+	setting->longDesc = strdup ("enabled");
+	setting->group = strdup ("");
+	setting->subGroup = strdup ("");
+	setting->type = TypeBool;
+	setting->defaultValue.parent = setting;
+	setting->defaultValue.value.asBool = FALSE;
+	setting->value = &setting->defaultValue;
+	pPrivate->settings = ccsSettingListAppend (pPrivate->settings, setting);
+    }
 
-    setting->parent = plugin;
-    setting->isScreen = FALSE;
-    setting->screenNum = 0;
-    setting->isDefault = TRUE;
-    setting->name = strdup ("____plugin_enabled");
-    setting->shortDesc = strdup ("enabled");
-    setting->longDesc = strdup ("enabled");
-    setting->group = strdup ("");
-    setting->subGroup = strdup ("");
-    setting->type = TypeBool;
-    setting->defaultValue.parent = setting;
-    setting->defaultValue.value.asBool = FALSE;
-    setting->value = &setting->defaultValue;
-    pPrivate->settings = ccsSettingListAppend (pPrivate->settings, setting);
     pPrivate->loaded = TRUE;
     collateGroups (pPrivate);
     context->plugins = ccsPluginListAppend (context->plugins, plugin);

Modified: fusion/compizconfig/libcompizconfig/src/config.c
===================================================================
--- fusion/compizconfig/libcompizconfig/src/config.c
+++ fusion/compizconfig/libcompizconfig/src/config.c
@@ -27,18 +27,31 @@
 
 #include "ccs-private.h"
 
+#define SETTINGPATH ".compizconfig"
+#define XDG_SETTINGPATH "compiz/compizconfig"
+
 static char*
 getConfigFileName (void)
 {
-    char *home;
+    char *configDir = NULL;
     char *fileName = NULL;
+    char *settingPath;
 
-    home = getenv ("HOME");
+    configDir = getenv ("XDG_CONFIG_HOME");
+    if (!configDir || !strlen (configDir))
+    {
+	configDir = getenv ("HOME");
+	if (!configDir || !strlen (configDir))
+	    return NULL;
 
-    if (!home || !strlen (home))
-	return NULL;
+	settingPath = SETTINGPATH;
+    }
+    else
+    {
+	settingPath = XDG_SETTINGPATH;
+    }
 
-    asprintf (&fileName, "%s/.compizconfig/config", home);
+    asprintf (&fileName, "%s/%s/config", configDir, settingPath);
 
     return fileName;
 }

Modified: fusion/compizconfig/libcompizconfig/src/filewatch.c
===================================================================
--- fusion/compizconfig/libcompizconfig/src/filewatch.c
+++ fusion/compizconfig/libcompizconfig/src/filewatch.c
@@ -111,6 +111,12 @@ unsigned int ccsAddFileWatch (const char            *fileName,
 #endif
 
     fwData = realloc (fwData, (fwDataSize + 1) * sizeof (FilewatchData));
+    if (!fwData)
+    {
+	fwDataSize = 0;
+	return 0;
+    }
+
     fwData[fwDataSize].fileName  = strdup (fileName);
 
 #if HAVE_SYS_INOTIFY_H
@@ -163,7 +169,11 @@ ccsRemoveFileWatch (unsigned int watchId)
     fwDataSize--;
 
     if (fwDataSize > 0)
+    {
 	fwData = realloc (fwData, fwDataSize * sizeof (FilewatchData));
+	if (!fwData)
+	    fwDataSize = 0;
+    }
     else
     {
 	free (fwData);

Modified: fusion/compizconfig/libcompizconfig/src/ini.c
===================================================================
--- fusion/compizconfig/libcompizconfig/src/ini.c
+++ fusion/compizconfig/libcompizconfig/src/ini.c
@@ -27,23 +27,50 @@
 #include <ccs.h>
 #include "iniparser.h"
 
-IniDictionary*
-ccsIniOpen (const char *fileName)
+/** 
+ * Creates the parent directory for @fileName, recursively creating a directory
+ * tree if necessary.
+ *
+ * @param fileName: The absolute path to the desired file
+ * @return: True if the parent directory of the file now exists
+**/
+
+static Bool
+ccsCreateDirFor (const char *fileName)
 {
     char *path, *delim;
-    FILE *file;
+    Bool success;
 
-    path = strdup (fileName);
-    delim = strrchr (path, '/');
-    if (delim)
-	*delim = 0;
+    delim = strrchr (fileName, '/');
+    if (!delim)
+	return FALSE;	/* Input string is not a valid absolue path! */
 
-    if (!mkdir (path, 0777) && (errno != EEXIST))
-    {
-	free (path);
-	return NULL;
+    path = malloc (delim - fileName + 1);
+    if (!path)
+	return FALSE;
+
+    strncpy (path, fileName, delim - fileName);
+    path[delim - fileName] = '\0';
+
+    success = !mkdir (path, 0700);	/* Mkdir returns 0 on success */
+    success |= (errno == EEXIST);
+
+    if (!success && (errno == ENOENT))	/* ENOENT means we must recursively */
+    {					/* create the parent's parent */
+	if (ccsCreateDirFor (path))
+	    success = !mkdir (path, 0700);
     }
+
     free (path);
+    return success;
+}
+
+IniDictionary * ccsIniOpen (const char * fileName)
+{
+    FILE *file;
+
+    if (!ccsCreateDirFor(fileName))
+	return NULL;
 
     /* create file if it doesn't exist or is desired */
     file = fopen (fileName, "a+");
@@ -69,19 +96,8 @@ void
 ccsIniSave (IniDictionary *dictionary,
 	    const char    *fileName)
 {
-    char *path, *delim;
-
-    path = strdup (fileName);
-    delim = strrchr (path, '/');
-    if (delim)
-	*delim = 0;
-
-    if (!mkdir (path, 0777) && (errno != EEXIST))
-    {
-	free (path);
+    if (!ccsCreateDirFor (fileName))
 	return;
-    }
-    free (path);
 
     iniparser_dump_ini (dictionary, fileName);
 }
@@ -369,6 +385,9 @@ ccsIniGetList (IniDictionary       *dictionary,
     case TypeMatch:
 	{
 	    char **array = malloc (nItems * sizeof (char*));
+	    if (!array)
+		break;
+
 	    while (token)
 	    {
 		array[i++] = strdup (token);
@@ -387,6 +406,9 @@ ccsIniGetList (IniDictionary       *dictionary,
 	{
 	    CCSSettingColorValue *array;
 	    array = malloc (nItems * sizeof (CCSSettingColorValue));
+	    if (!array)
+		break;
+
 	    while (token)
 	    {
 		memset (&array[i], 0, sizeof (CCSSettingColorValue));
@@ -403,6 +425,9 @@ ccsIniGetList (IniDictionary       *dictionary,
 	{
 	    Bool *array = malloc (nItems * sizeof (Bool));
 	    Bool isTrue;
+	    if (!array)
+		break;
+
 	    while (token)
 	    {
 		isTrue = (token[0] == 'y' || token[0] == 'Y' || 
@@ -419,6 +444,9 @@ ccsIniGetList (IniDictionary       *dictionary,
     case TypeInt:
 	{
 	    int *array = malloc (nItems * sizeof (int));
+	    if (!array)
+		break;
+
 	    while (token)
 	    {
 		array[i++] = strtoul (token, NULL, 10);
@@ -432,6 +460,9 @@ ccsIniGetList (IniDictionary       *dictionary,
     case TypeFloat:
 	{
 	    float *array = malloc (nItems * sizeof (float));
+	    if (!array)
+		break;
+
 	    while (token)
 	    {
 		array[i++] = strtod (token, NULL);
@@ -446,6 +477,9 @@ ccsIniGetList (IniDictionary       *dictionary,
 	{
 	    CCSSettingActionValue *array;
 	    array = malloc (nItems * sizeof (CCSSettingActionValue));
+	    if (!array)
+		break;
+
 	    while (token)
 	    {
 		parseActionString (token, &array[i++]);

Modified: fusion/compizconfig/libcompizconfig/src/iniparser.c
===================================================================
--- fusion/compizconfig/libcompizconfig/src/iniparser.c
+++ fusion/compizconfig/libcompizconfig/src/iniparser.c
@@ -63,7 +63,10 @@ ini_file_lock (const char *fileName, Bool exclusive)
 	return NULL;
 
     lock = malloc (sizeof (FileLock));
-    lock ->fd = fd;
+    if (!lock)
+	return NULL;
+
+    lock->fd = fd;
     memset (&lockinfo, 0, sizeof (struct flock));
 
     if (exclusive)
@@ -212,6 +215,9 @@ mem_double (void * ptr, int size)
     void *newptr;
 
     newptr = calloc (2 * size, 1);
+    if (!newptr)
+	return NULL;
+
     memcpy (newptr, ptr, size);
     free (ptr);
     return newptr;
@@ -276,11 +282,33 @@ dictionary_new (int size)
 	size = DICTMINSZ;
 
     d = (dictionary *) calloc (1, sizeof (dictionary));
+    if (!d)
+	return NULL;
 
     d->size = size;
     d->val  = (char **) calloc (size, sizeof (char*));
+    if (!d->val)
+    {
+	free (d);
+	return NULL;
+    }
+
     d->key  = (char **) calloc (size, sizeof (char*));
+    if (!d->key)
+    {
+	free (d->val);
+	free (d);
+	return NULL;
+    }
+
     d->hash = (unsigned int *) calloc (size, sizeof (unsigned));
+    if (!d->hash)
+    {
+	free (d->key);
+	free (d->val);
+	free (d);
+	return NULL;
+    }
 
     return d;
 }

Modified: fusion/compizconfig/libcompizconfig/src/lists.c
===================================================================
--- fusion/compizconfig/libcompizconfig/src/lists.c
+++ fusion/compizconfig/libcompizconfig/src/lists.c
@@ -36,6 +36,8 @@ typedef void (*freeFunc) (void *ptr);
     { \
 	CCS##type##List l = list; \
 	CCS##type##List ne = malloc(sizeof(struct _CCS##type##List)); \
+	if (!ne) \
+	    return list; \
 	ne->data = data; \
 	ne->next = NULL; \
 	if (!list) \
@@ -48,6 +50,8 @@ typedef void (*freeFunc) (void *ptr);
     CCS##type##List ccs##type##ListPrepend (CCS##type##List list, dtype *data) \
     { \
 	CCS##type##List ne = malloc(sizeof(struct _CCS##type##List)); \
+	if (!ne) \
+	    return list; \
 	ne->data = data; \
 	ne->next = list; \
 	return ne; \
@@ -57,6 +61,8 @@ typedef void (*freeFunc) (void *ptr);
     { \
 	CCS##type##List l = list; \
 	CCS##type##List ne = malloc(sizeof(struct _CCS##type##List)); \
+	if (!ne) \
+	    return list; \
 	ne->data = data; \
 	ne->next = list; \
 	if (!list || !position) \
@@ -76,6 +82,8 @@ typedef void (*freeFunc) (void *ptr);
     { \
 	CCS##type##List l = list; \
 	CCS##type##List ne = malloc(sizeof(struct _CCS##type##List)); \
+	if (!ne) \
+	    return list; \
 	while (l && (l != sibling)) l = l->next; \
 	ne->data = data; \
 	ne->next = l; \
@@ -181,7 +189,10 @@ CCSSettingValueList ccsGetValueListFromStringList (CCSStringList list,
 
     while (list)
     {
-	NEW (CCSSettingValue, value);
+	CCSSettingValue *value = malloc (sizeof (CCSSettingValue));
+	if (!value)
+	    return rv;
+
 	value->isListChild = TRUE;
 	value->parent = parent;
 	value->value.asString = strdup (list->data);
@@ -212,7 +223,11 @@ char ** ccsGetStringArrayFromList (CCSStringList list, int *num)
     int i;
 
     if (length)
-	rv = malloc (length * sizeof (char *) );
+    {
+	rv = malloc (length * sizeof (char *));
+	if (!rv)
+	    return NULL;
+    }
 
     for (i = 0; i < length; i++, list = list->next)
 	rv[i] = strdup (list->data);
@@ -240,7 +255,11 @@ char ** ccsGetStringArrayFromValueList (CCSSettingValueList list, int *num)
     int i;
 
     if (length)
-	rv = malloc (length * sizeof (int) );
+    {
+	rv = malloc (length * sizeof (int));
+	if (!rv)
+	    return NULL;
+    }
 
     for (i = 0; i < length; i++, list = list->next)
 	rv[i] = strdup (list->data->value.asString);
@@ -257,7 +276,11 @@ char ** ccsGetMatchArrayFromValueList (CCSSettingValueList list, int *num)
     int i;
 
     if (length)
-	rv = malloc (length * sizeof (int) );
+    {
+	rv = malloc (length * sizeof (int));
+	if (!rv)
+	    return NULL;
+    }
 
     for (i = 0; i < length; i++, list = list->next)
 	rv[i] = strdup (list->data->value.asMatch);
@@ -274,7 +297,11 @@ int * ccsGetIntArrayFromValueList (CCSSettingValueList list, int *num)
     int i;
 
     if (length)
-	rv = malloc (length * sizeof (int) );
+    {
+	rv = malloc (length * sizeof (int));
+	if (!rv)
+	    return NULL;
+    }
 
     for (i = 0; i < length; i++, list = list->next)
 	rv[i] = list->data->value.asInt;
@@ -291,7 +318,11 @@ float * ccsGetFloatArrayFromValueList (CCSSettingValueList list, int *num)
     int i;
 
     if (length)
-	rv = malloc (length * sizeof (float) );
+    {
+	rv = malloc (length * sizeof (float));
+	if (!rv)
+	    return NULL;
+    }
 
     for (i = 0; i < length; i++, list = list->next)
 	rv[i] = list->data->value.asFloat;
@@ -308,7 +339,11 @@ Bool * ccsGetBoolArrayFromValueList (CCSSettingValueList list, int *num)
     int i;
 
     if (length)
-	rv = malloc (length * sizeof (Bool) );
+    {
+	rv = malloc (length * sizeof (Bool));
+	if (!rv)
+	    return NULL;
+    }
 
     for (i = 0; i < length; i++, list = list->next)
 	rv[i] = list->data->value.asBool;
@@ -326,10 +361,15 @@ CCSSettingColorValue * ccsGetColorArrayFromValueList (CCSSettingValueList list,
     int i;
 
     if (length)
-	rv = malloc (length * sizeof (CCSSettingColorValue) );
+    {
+	rv = malloc (length * sizeof (CCSSettingColorValue));
+	if (!rv)
+	    return NULL;
+    }
 
     for (i = 0; i < length; i++, list = list->next)
-	memcpy (&rv[i], &list->data->value.asColor, sizeof (CCSSettingColorValue) );
+	memcpy (&rv[i], &list->data->value.asColor,
+		sizeof (CCSSettingColorValue));
 
     *num = length;
 
@@ -344,11 +384,15 @@ CCSSettingActionValue * ccsGetActionArrayFromValueList (CCSSettingValueList list
     int i;
 
     if (length)
-	rv = malloc (length * sizeof (CCSSettingActionValue) );
+    {
+	rv = malloc (length * sizeof (CCSSettingActionValue));
+	if (!rv)
+	    return NULL;
+    }
 
     for (i = 0; i < length; i++, list = list->next)
 	memcpy (&rv[i], &list->data->value.asAction,
-		sizeof (CCSSettingActionValue) );
+		sizeof (CCSSettingActionValue));
 
     *num = length;
 
@@ -363,7 +407,10 @@ CCSSettingValueList ccsGetValueListFromStringArray (char ** array, int num,
 
     for (i = 0; i < num; i++)
     {
-	NEW (CCSSettingValue, value);
+	CCSSettingValue *value = malloc (sizeof (CCSSettingValue));
+	if (!value)
+	    return l;
+
 	value->isListChild = TRUE;
 	value->parent = parent;
 	value->value.asString = strdup (array[i]);
@@ -381,7 +428,10 @@ CCSSettingValueList ccsGetValueListFromMatchArray (char ** array, int num,
 
     for (i = 0; i < num; i++)
     {
-	NEW (CCSSettingValue, value);
+	CCSSettingValue *value = malloc (sizeof (CCSSettingValue));
+	if (!value)
+	    return l;
+
 	value->isListChild = TRUE;
 	value->parent = parent;
 	value->value.asMatch = strdup (array[i]);
@@ -399,7 +449,10 @@ CCSSettingValueList ccsGetValueListFromIntArray (int * array, int num,
 
     for (i = 0; i < num; i++)
     {
-	NEW (CCSSettingValue, value);
+	CCSSettingValue *value = malloc (sizeof (CCSSettingValue));
+	if (!value)
+	    return l;
+
 	value->isListChild = TRUE;
 	value->parent = parent;
 	value->value.asInt = array[i];
@@ -417,7 +470,10 @@ CCSSettingValueList ccsGetValueListFromFloatArray (float * array, int num,
 
     for (i = 0; i < num; i++)
     {
-	NEW (CCSSettingValue, value);
+	CCSSettingValue *value = malloc (sizeof (CCSSettingValue));
+	if (!value)
+	    return l;
+
 	value->isListChild = TRUE;
 	value->parent = parent;
 	value->value.asFloat = array[i];
@@ -435,7 +491,10 @@ CCSSettingValueList ccsGetValueListFromBoolArray (Bool * array, int num,
 
     for (i = 0; i < num; i++)
     {
-	NEW (CCSSettingValue, value);
+	CCSSettingValue *value = malloc (sizeof (CCSSettingValue));
+	if (!value)
+	    return l;
+
 	value->isListChild = TRUE;
 	value->parent = parent;
 	value->value.asBool = array[i];
@@ -453,7 +512,10 @@ CCSSettingValueList ccsGetValueListFromColorArray (CCSSettingColorValue * array,
 
     for (i = 0; i < num; i++)
     {
-	NEW (CCSSettingValue, value);
+	CCSSettingValue *value = malloc (sizeof (CCSSettingValue));
+	if (!value)
+	    return l;
+
 	value->isListChild = TRUE;
 	value->parent = parent;
 	value->value.asColor = array[i];
@@ -471,7 +533,10 @@ CCSSettingValueList ccsGetValueListFromActionArray (CCSSettingActionValue * arra
 
     for (i = 0; i < num; i++)
     {
-	NEW (CCSSettingValue, value);
+	CCSSettingValue *value = malloc (sizeof (CCSSettingValue));
+	if (!value)
+	    return l;
+
 	value->isListChild = TRUE;
 	value->parent = parent;
 	value->value.asAction = array[i];

Modified: fusion/compizconfig/libcompizconfig/src/main.c
===================================================================
--- fusion/compizconfig/libcompizconfig/src/main.c
+++ fusion/compizconfig/libcompizconfig/src/main.c
@@ -83,13 +83,23 @@ configChangeNotify (unsigned int watchId, void *closure)
 CCSContext *
 ccsEmptyContextNew (unsigned int *screens, unsigned int numScreens)
 {
-    NEW (CCSContext, context);
+    CCSContext *context;
+
+    context = calloc (1, sizeof (CCSContext));
+    if (!context)
+	return NULL;
 
     if (numScreens > 0 && screens)
     {
 	int i;
 
 	context->screens = calloc (1, sizeof (unsigned int) * numScreens);
+	if (!context->screens)
+	{
+	    free (context);
+	    return NULL;
+	}
+
 	context->numScreens = numScreens;
 
 	for (i = 0; i < numScreens; i++)
@@ -98,6 +108,11 @@ ccsEmptyContextNew (unsigned int *screens, unsigned int numScreens)
     else
     {
 	context->screens = calloc (1, sizeof (unsigned int));
+	if (!context->screens)
+	{
+	    free (context);
+	    return NULL;
+	}
 	context->screens[0] = 0;
 	context->numScreens = 1;
     }
@@ -194,6 +209,7 @@ static void
 subGroupAdd (CCSSetting * setting, CCSGroup * group)
 {
     CCSSubGroupList l = group->subGroups;
+    CCSSubGroup     *subGroup;
 
     while (l)
     {
@@ -207,17 +223,20 @@ subGroupAdd (CCSSetting * setting, CCSGroup * group)
 	l = l->next;
     }
 
-    NEW (CCSSubGroup, subGroup);
-
-    group->subGroups = ccsSubGroupListAppend (group->subGroups, subGroup);
-    subGroup->name = strdup (setting->subGroup);
-    subGroup->settings = ccsSettingListAppend (subGroup->settings, setting);
+    subGroup = malloc (sizeof (CCSSubGroup));
+    if (subGroup)
+    {
+	group->subGroups = ccsSubGroupListAppend (group->subGroups, subGroup);
+	subGroup->name = strdup (setting->subGroup);
+	subGroup->settings = ccsSettingListAppend (subGroup->settings, setting);
+    }
 }
 
 static void
 groupAdd (CCSSetting * setting, CCSPluginPrivate * p)
 {
     CCSGroupList l = p->groups;
+    CCSGroup     *group;
 
     while (l)
     {
@@ -230,11 +249,13 @@ groupAdd (CCSSetting * setting, CCSPluginPrivate * p)
 	l = l->next;
     }
 
-    NEW (CCSGroup, group);
-
-    p->groups = ccsGroupListAppend (p->groups, group);
-    group->name = strdup (setting->group);
-    subGroupAdd (setting, group);
+    group = malloc (sizeof (CCSGroup));
+    if (group)
+    {
+    	p->groups = ccsGroupListAppend (p->groups, group);
+	group->name = strdup (setting->group);
+	subGroupAdd (setting, group);
+    }
 }
 
 void
@@ -527,6 +548,11 @@ ccsSetBackend (CCSContext * context, char *name)
     }
 
     context->backend = malloc (sizeof (CCSBackend));
+    if (!context->backend)
+    {
+	dlclose (dlhand);
+	return FALSE;
+    }
     context->backend->dlhand = dlhand;
     context->backend->vTable = vt;
 
@@ -562,7 +588,10 @@ copyValue (CCSSettingValue * from, CCSSettingValue * to)
 	CCSSettingValueList l = from->value.asList;
 	while (l)
 	{
-	    NEW (CCSSettingValue, value);
+	    CCSSettingValue *value = malloc (sizeof (CCSSettingValue));
+	    if (!value)
+		break;
+
 	    copyValue (l->data, value);
 	    to->value.asList = ccsSettingValueListAppend (to->value.asList,
 							  value);
@@ -577,10 +606,18 @@ copyValue (CCSSettingValue * from, CCSSettingValue * to)
 static void
 copyFromDefault (CCSSetting * setting)
 {
+    CCSSettingValue *value;
+
     if (setting->value != &setting->defaultValue)
 	ccsFreeSettingValue (setting->value);
 
-    NEW (CCSSettingValue, value);
+    value = malloc (sizeof (CCSSettingValue));
+    if (!value)
+    {
+	setting->value = &setting->defaultValue;
+	setting->isDefault = TRUE;
+	return;
+    }
 
     copyValue (&setting->defaultValue, value);
     setting->value = value;
@@ -935,7 +972,10 @@ ccsCopyList (CCSSettingValueList l1, CCSSetting * setting)
 
     while (l1)
     {
-	NEW (CCSSettingValue, value);
+	CCSSettingValue *value = malloc (sizeof (CCSSettingValue));
+	if (!value)
+	    return l2;
+
 	value->parent = setting;
 	value->isListChild = TRUE;
 
@@ -1207,6 +1247,9 @@ ccsGetSortedPluginStringList (CCSContext * context)
     /* TODO: conflict handling */
 
     PluginSortHelper *plugins = malloc (len * sizeof (PluginSortHelper));
+    if (!plugins)
+	return NULL;
+
     for (i = 0; i < len; i++, list = list->next)
     {
 	plugins[i].plugin = list->data;
@@ -1577,22 +1620,28 @@ ccsCanEnablePlugin (CCSContext * context, CCSPlugin * plugin)
     {
 	if (!ccsFindPlugin (context, sl->data))
 	{
-	    NEW (CCSPluginConflict, conflict);
-	    conflict->value = strdup (sl->data);
-	    conflict->type = ConflictPluginError;
-	    conflict->plugins = NULL;
-	    list = ccsPluginConflictListAppend (list, conflict);
+	    CCSPluginConflict *conflict = malloc (sizeof (CCSPluginConflict));
+	    if (conflict)
+	    {
+		conflict->value = strdup (sl->data);
+		conflict->type = ConflictPluginError;
+		conflict->plugins = NULL;
+		list = ccsPluginConflictListAppend (list, conflict);
+	    }
 	}
 	else if (!ccsPluginIsActive (context, sl->data))
 	{
 	    /* we've not seen a matching plugin */
-	    NEW (CCSPluginConflict, conflict);
-	    conflict->value = strdup (sl->data);
-	    conflict->type = ConflictRequiresPlugin;
-	    conflict->plugins =
-		ccsPluginListAppend (conflict->plugins,
-				     ccsFindPlugin (context, sl->data));
-	    list = ccsPluginConflictListAppend (list, conflict);
+	    CCSPluginConflict *conflict = malloc (sizeof (CCSPluginConflict));
+	    if (conflict)
+	    {
+		conflict->value = strdup (sl->data);
+		conflict->type = ConflictRequiresPlugin;
+		conflict->plugins =
+		    ccsPluginListAppend (conflict->plugins,
+			    		 ccsFindPlugin (context, sl->data));
+		list = ccsPluginConflictListAppend (list, conflict);
+	    }
 	}
 
 	sl = sl->next;
@@ -1638,13 +1687,16 @@ ccsCanEnablePlugin (CCSContext * context, CCSPlugin * plugin)
 	if (!pl)
 	{
 	    /* no plugin provides that feature */
-	    NEW (CCSPluginConflict, conflict);
+	    CCSPluginConflict *conflict = malloc (sizeof (CCSPluginConflict));
 
-	    conflict->value = strdup (sl->data);
-	    conflict->type = ConflictRequiresFeature;
-	    conflict->plugins = pl2;
+	    if (conflict)
+	    {
+		conflict->value = strdup (sl->data);
+		conflict->type = ConflictRequiresFeature;
+		conflict->plugins = pl2;
 
-	    list = ccsPluginConflictListAppend (list, conflict);
+		list = ccsPluginConflictListAppend (list, conflict);
+	    }
 	}
 
 	sl = sl->next;
@@ -1670,11 +1722,16 @@ ccsCanEnablePlugin (CCSContext * context, CCSPlugin * plugin)
 			if (!conflict)
 			{
 			    conflict = calloc (1, sizeof (CCSPluginConflict));
-			    conflict->value = strdup (sl->data);
-			    conflict->type = ConflictFeature;
+			    if (conflict)
+			    {
+				conflict->value = strdup (sl->data);
+				conflict->type = ConflictFeature;
+			    }
 			}
-			conflict->plugins =
-			    ccsPluginListAppend (conflict->plugins, pl->data);
+			if (conflict)
+			    conflict->plugins =
+				ccsPluginListAppend (conflict->plugins,
+						     pl->data);
 		    }
 		    featureList = featureList->next;
 		}
@@ -1707,11 +1764,16 @@ ccsCanEnablePlugin (CCSContext * context, CCSPlugin * plugin)
 			if (!conflict)
 			{
 			    conflict = calloc (1, sizeof (CCSPluginConflict));
-			    conflict->value = strdup (sl->data);
-			    conflict->type = ConflictFeature;
+			    if (conflict)
+			    {
+				conflict->value = strdup (sl->data);
+				conflict->type = ConflictFeature;
+			    }
 			}
-			conflict->plugins =
-			    ccsPluginListAppend (conflict->plugins, pl->data);
+			if (conflict)
+			    conflict->plugins =
+				ccsPluginListAppend (conflict->plugins,
+						     pl->data);
 		    }
 		    featureList = featureList->next;
 		}
@@ -1732,13 +1794,16 @@ ccsCanEnablePlugin (CCSContext * context, CCSPlugin * plugin)
     {
 	if (ccsPluginIsActive (context, sl->data))
 	{
-	    NEW (CCSPluginConflict, conflict);
-	    conflict->value = strdup (sl->data);
-	    conflict->type = ConflictPlugin;
-	    conflict->plugins =
-		ccsPluginListAppend (conflict->plugins,
-				     ccsFindPlugin (context, sl->data));
-	    list = ccsPluginConflictListAppend (list, conflict);
+	    CCSPluginConflict *conflict = malloc (sizeof (CCSPluginConflict));
+	    if (conflict)
+	    {
+		conflict->value = strdup (sl->data);
+		conflict->type = ConflictPlugin;
+		conflict->plugins =
+		    ccsPluginListAppend (conflict->plugins,
+			    		 ccsFindPlugin (context, sl->data));
+		list = ccsPluginConflictListAppend (list, conflict);
+	    }
 	}
 
 	sl = sl->next;
@@ -1777,11 +1842,16 @@ ccsCanDisablePlugin (CCSContext * context, CCSPlugin * plugin)
 		if (!conflict)
 		{
 		    conflict = calloc (1, sizeof (CCSPluginConflict));
-		    conflict->value = strdup (plugin->name);
-		    conflict->type = ConflictPluginNeeded;
+		    if (conflict)
+		    {
+			conflict->value = strdup (plugin->name);
+			conflict->type = ConflictPluginNeeded;
+		    }
 		}
-		conflict->plugins =
-		    ccsPluginListAppend (conflict->plugins, pl->data);
+
+		if (conflict)
+		    conflict->plugins =
+			ccsPluginListAppend (conflict->plugins, pl->data);
 		break;
 	    }
 	    pluginList = pluginList->next;
@@ -1819,11 +1889,15 @@ ccsCanDisablePlugin (CCSContext * context, CCSPlugin * plugin)
 		    {
 			conflict = calloc (1, sizeof (CCSPluginConflict));
 
-			conflict->value = strdup (sl->data);
-			conflict->type = ConflictPluginNeeded;
+			if (conflict)
+			{
+			    conflict->value = strdup (sl->data);
+			    conflict->type = ConflictPluginNeeded;
+			}
 		    }
-		    conflict->plugins =
-			ccsPluginListAppend (conflict->plugins, pl->data);
+		    if (conflict)
+			conflict->plugins =
+			    ccsPluginListAppend (conflict->plugins, pl->data);
 		}
 		pluginList = pluginList->next;
 	    }
@@ -1868,9 +1942,26 @@ CCSActionConflictList
 ccsCanSetAction (CCSContext * context, CCSSettingActionValue action)
 {
     CCSActionConflictList rv = NULL;
-    NEW (CCSActionConflict, keyC);
-    NEW (CCSActionConflict, buttonC);
-    NEW (CCSActionConflict, edgeC);
+    CCSActionConflict *keyC, *buttonC, *edgeC;
+
+    keyC = malloc (sizeof (CCSActionConflict));
+    if (!keyC)
+	return NULL;
+
+    buttonC = malloc (sizeof (CCSActionConflict));
+    if (!buttonC)
+    {
+	free (keyC);
+	return NULL;
+    }
+
+    edgeC = malloc (sizeof (CCSActionConflict));
+    if (!edgeC)
+    {
+	free (keyC);
+	free (buttonC);
+	return NULL;
+    }
 
     keyC->type = ConflictKey;
     buttonC->type = ConflictButton;
@@ -1988,6 +2079,8 @@ addBackendInfo (CCSBackendInfoList * bl, char *file)
     void *dlhand = NULL;
     char *err = NULL;
     Bool found = FALSE;
+    CCSBackendInfo *info;
+
     dlerror ();
 
     dlhand = dlopen (file, RTLD_LAZY);
@@ -2027,7 +2120,12 @@ addBackendInfo (CCSBackendInfoList * bl, char *file)
 	return;
     }
 
-    NEW (CCSBackendInfo, info);
+    info = malloc (sizeof (CCSBackendInfo));
+    if (!info)
+    {
+	dlclose (dlhand);
+	return;
+    }
 
     info->name = strdup (vt->name);
     info->shortDesc = (vt->shortDesc) ? strdup (vt->shortDesc) : strdup ("");


More information about the commits mailing list