[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