From fb95ab181475d73b8204c5963f099443027cebe3 Mon Sep 17 00:00:00 2001 From: sebastid Date: Fri, 4 Nov 2005 17:44:01 +0000 Subject: [PATCH] Delay string duplication until necessary. Fix leak. SVN revision: 18287 --- legacy/eet/src/lib/eet_lib.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/legacy/eet/src/lib/eet_lib.c b/legacy/eet/src/lib/eet_lib.c index eb59accaa8..903049bb28 100644 --- a/legacy/eet/src/lib/eet_lib.c +++ b/legacy/eet/src/lib/eet_lib.c @@ -916,10 +916,6 @@ eet_write(Eet_File *ef, char *name, void *data, int size, int compress) if (!ef->header->directory->nodes) return 0; } - /* dup name */ - name = strdup(name); - if (!name) return 0; - /* figure hash bucket */ hash = eet_hash_gen(name, ef->header->directory->size); @@ -930,11 +926,8 @@ eet_write(Eet_File *ef, char *name, void *data, int size, int compress) if (compress) data_size = 12 + ((size * 101) / 100); data2 = malloc(data_size); - if (!data2) - { - free(name); - return 0; - } + if (!data2) return 0; + /* if we want to compress */ if (compress) { @@ -945,7 +938,6 @@ eet_write(Eet_File *ef, char *name, void *data, int size, int compress) if (compress2((Bytef *)data2, &buflen, (Bytef *)data, (uLong)size, Z_BEST_COMPRESSION) != Z_OK) { - free(name); free(data2); return 0; } @@ -981,7 +973,6 @@ eet_write(Eet_File *ef, char *name, void *data, int size, int compress) efn->data_size = size; efn->data = data2; exists_already = 1; - free(name); break; } } @@ -991,13 +982,18 @@ eet_write(Eet_File *ef, char *name, void *data, int size, int compress) efn = calloc(1, sizeof(Eet_File_Node)); if (!efn) { - free(name); + free(data2); + return 0; + } + efn->name = strdup(name); + if (!efn->name) + { + free(efn); free(data2); return 0; } efn->next = ef->header->directory->nodes[hash]; ef->header->directory->nodes[hash] = efn; - efn->name = name; efn->offset = 0; efn->compression = !!compress; efn->size = data_size; @@ -1036,6 +1032,7 @@ eet_delete(Eet_File *ef, char *name) if (eet_string_match(efn->name, name)) { if (efn->data) free(efn->data); + if (efn->name) free(efn->name); if (efn == ef->header->directory->nodes[hash]) ef->header->directory->nodes[hash] = efn->next; else