rendered paste bodydiff --git a/plugins/ini.c b/plugins/ini.cindex 52e224c..1968105 100644--- a/plugins/ini.c+++ b/plugins/ini.c@@ -26,6 +26,7 @@ * David Reveman <davidr@novell.com> */ +#define _GNU_SOURCE /* for asprintf */ #include <stdio.h> #include <stdlib.h> #include <string.h>@@ -895,7 +854,6 @@ iniSaveOptions (CompDisplay *d, while (nOption--) { status = FALSE;- strVal = strdup (""); int i; switch (option->type)@@ -907,8 +865,11 @@ iniSaveOptions (CompDisplay *d, case CompOptionTypeColor: case CompOptionTypeMatch: strVal = iniOptionValueToString (&option->value, option->type);- if (strVal[0] != '\0')+ if (strVal)+ { fprintf (optionFile, "%s=%s\n", option->name, strVal);+ free (strVal);+ } else fprintf (optionFile, "%s=\n", option->name); break;@@ -916,47 +877,43 @@ iniSaveOptions (CompDisplay *d, firstInList = TRUE; if (option->value.action.type & CompBindingTypeKey) strVal = keyBindingToString (d, &option->value.action.key);+ else+ strVal = strdup (""); fprintf (optionFile, "%s_%s=%s\n", option->name, "key", strVal);+ free (strVal); - strVal = strdup (""); if (option->value.action.type & CompBindingTypeButton) strVal = buttonBindingToString (d, &option->value.action.button);+ else+ strVal = strdup (""); fprintf (optionFile, "%s_%s=%s\n", option->name, "button", strVal);+ free (strVal); - if (!(strVal = realloc (strVal, sizeof (char) * 32)))- return FALSE;- sprintf(strVal, "%i", (int)option->value.action.bell);+ asprintf(&strVal, "%i", (int)option->value.action.bell); fprintf (optionFile, "%s_%s=%s\n", option->name, "bell", strVal);+ free (strVal); - strVal = strdup ("");+ strVal = malloc (sizeof(char) * MAX_OPTION_LENGTH);+ strcpy (strVal, ""); for (i = 0; i < SCREEN_EDGE_NUM; i++) { if (option->value.action.edgeMask & (1 << i)) {- char listVal[MAX_OPTION_LENGTH];- strcpy (listVal, edgeToString (i));- if (!(strVal = realloc (strVal, MAX_OPTION_LENGTH)))- return FALSE;-- if (!firstInList)- strVal = strcat (strVal, ",");- firstInList = FALSE;-- if (listVal)- strVal = strcat (strVal, listVal);+ strncat (strVal, edgeToString (i), MAX_OPTION_LENGTH);+ strncat (strVal, ",", MAX_OPTION_LENGTH); } } fprintf (optionFile, "%s_%s=%s\n", option->name, "edge", strVal);+ free (strVal); - strVal = strdup (""); if (option->value.action.type & CompBindingTypeEdgeButton)- sprintf(strVal, "%i", option->value.action.edgeButton);+ asprintf (&strVal, "%i", option->value.action.edgeButton); else- sprintf(strVal, "%i", 0);+ asprintf (&strVal, "%i", 0); fprintf (optionFile, "%s_%s=%s\n", option->name, "edgebutton", strVal);-- break;+ free (strVal);+ break; case CompOptionTypeList: firstInList = TRUE; switch (option->value.list.type)@@ -968,30 +925,30 @@ iniSaveOptions (CompDisplay *d, case CompOptionTypeColor: case CompOptionTypeMatch: {- if (option->value.list.nValue && - !(strVal = realloc (strVal, sizeof (char) * MAX_OPTION_LENGTH * option->value.list.nValue)))+ int stringLen = MAX_OPTION_LENGTH * option->value.list.nValue;+ char *itemVal;++ strVal = malloc (sizeof(char) * stringLen);+ if (!strVal) return FALSE;+ strcpy (strVal, ""); for (i = 0; i < option->value.list.nValue; i++) {- char listVal[MAX_OPTION_LENGTH];-- strncpy (listVal, iniOptionValueToString (+ itemVal = iniOptionValueToString ( &option->value.list.value[i],- option->value.list.type),- MAX_OPTION_LENGTH);+ option->value.list.type); - if (!firstInList)- strVal = strcat (strVal, ",");- firstInList = FALSE;-- if (listVal)- strVal = strcat (strVal, listVal);+ if (itemVal)+ {+ strncat (strVal, itemVal, stringLen);+ free (itemVal);+ }+ strncat (strVal, ",", stringLen); }- if (strVal[0] != '\0')- fprintf (optionFile, "%s=%s\n", option->name, strVal);- else- fprintf (optionFile, "%s=\n", option->name);++ fprintf (optionFile, "%s=%s\n", option->name, strVal);+ free (strVal); break; } default:@@ -1012,8 +969,6 @@ iniSaveOptions (CompDisplay *d, fclose (optionFile); - if (strVal)- free (strVal); free (filename); free (directory); free (fullPath);