summaryrefslogtreecommitdiffstats
path: root/lib/libsi18n/reshash.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libsi18n/reshash.c')
-rw-r--r--lib/libsi18n/reshash.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/lib/libsi18n/reshash.c b/lib/libsi18n/reshash.c
index 898d02f5..4c8e9006 100644
--- a/lib/libsi18n/reshash.c
+++ b/lib/libsi18n/reshash.c
@@ -253,7 +253,7 @@ ResHash * ResHashCreate(char * name)
/* Create hash table */
pResHash = (ResHash *) malloc (sizeof(ResHash));
if (pResHash == NULL)
- return NULL;
+ goto error;
memset(pResHash, 0, sizeof(ResHash));
@@ -262,11 +262,26 @@ ResHash * ResHashCreate(char * name)
/* Create initial tree item and it's valuelist to hash table */
pResHash->treelist = (TreeNode *) malloc(sizeof(TreeNode));
- if (pResHash->treelist)
- memset(pResHash->treelist, 0, sizeof(TreeNode));
+ if (pResHash->treelist == NULL)
+ goto error;
+
+ memset(pResHash->treelist, 0, sizeof(TreeNode));
+
pResHash->treelist->vlist = (ValueNode *) malloc(sizeof(ValueNode));
+ if (pResHash->treelist->vlist == NULL)
+ goto error;
+
memset(pResHash->treelist->vlist, 0, sizeof(ValueNode));
+ goto done;
+
+error:
+ if (pResHash->treelist->vlist) free(pResHash->treelist->vlist);
+ if (pResHash->treelist) free(pResHash->treelist);
+ if (pResHash) free(pResHash);
+ return NULL;
+
+done:
return pResHash;
}