rem: free(buffer);
add: wfree(buffer);
context: wDefaultChangeIcon(WScreen *scr, char *instance, char* class, char *file){    WDDomain *db = WDWindowAttributes;    proplist_t icon_value=NULL, value, attr, key, def_win, def_icon=NULL;    proplist_t dict = db->dictionary;    int same = 0;    if (!dict) {        dict = PLMakeDictionaryFromEntries(NULL, NULL, NULL);        if (dict) {            db->dictionary = dict;            value = PLMakeString(db->path);            PLSetFilename(dict, value);            PLRelease(value);        }        else            return;    }    PLSetStringCmpHook(NULL);    if (instance && class) {    	char *buffer;        buffer = wmalloc(strlen(instance) + strlen(class) + 2);        strcat(strcat(strcpy(buffer, instance), "."), class);        key = PLMakeString(buffer);        free(buffer);    } else if (instance) {        key = PLMakeString(instance);    } else if (class) {        key = PLMakeString(class);    } else {        key = PLRetain(AnyWindow);    }    if (file) {        value = PLMakeString(file);        icon_value = PLMakeDictionaryFromEntries(AIcon, value, NULL);        PLRelease(value);        if ((def_win = PLGetDictionaryEntry(dict, AnyWindow)) != NULL) {            def_icon = PLGetDictionaryEntry(def_win, AIcon);        }        if (def_icon && !strcmp(PLGetString(def_icon), file))            same = 1;    }    if ((attr = PLGetDictionaryEntry(dict, key)) != NULL) {        if (PLIsDictionary(attr)) {            if (icon_value!=NULL && !same)                PLMergeDictionaries(attr, icon_value);            else                PLRemoveDictionaryEntry(attr, AIcon);        }    } else if (icon_value!=NULL && !same) {        PLInsertDictionaryEntry(dict, key, icon_value);    }    if (!wPreferences.flags.noupdates)	PLSave(dict, YES);    PLRelease(key);    if(icon_value)        PLRelease(icon_value);    PLSetStringCmpHook(StringCompareHook);}