From e4d3f6140cc167580ec43de6fc3ea4562aaba63e Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 18 Jan 2012 18:14:18 +0000 Subject: Fix memory leaks. git-svn-id: http://svn.drobilla.net/lad/trunk/lilv@3966 a436a847-0d15-0410-975c-d299462d15a1 --- src/state.c | 13 +++++++++++-- src/util.c | 13 ++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/state.c b/src/state.c index 5f8a13f..270b9bb 100644 --- a/src/state.c +++ b/src/state.c @@ -203,6 +203,7 @@ abstract_path(LV2_State_Map_Path_Handle handle, copy = lilv_find_free_path(real_path, lilv_path_exists, NULL); lilv_copy_file(real_path, copy); } + free(real_path); real_path = copy; // Refer to the latest copy in plugin state @@ -852,6 +853,9 @@ lilv_state_save(LilvWorld* world, } // FIXME: make parameter non-const? + if (state->dir) { + free(state->dir); + } ((LilvState*)state)->dir = lilv_strdup(dir); char* const manifest = lilv_path_join(dir, "manifest.ttl"); @@ -922,10 +926,11 @@ lilv_state_save(LilvWorld* world, i = zix_tree_iter_next(i)) { const PathMap* pm = (const PathMap*)zix_tree_get(i); - char* real_dir = lilv_strjoin(lilv_realpath(dir), "/", NULL); + char* real_dir = lilv_realpath(dir); + char* base = lilv_path_join(real_dir, NULL); char* rel_path = lilv_path_join(dir, pm->rel); char* target_path = lilv_path_is_child(pm->abs, state->file_dir) - ? lilv_path_relative_to(pm->abs, real_dir) + ? lilv_path_relative_to(pm->abs, base) : lilv_strdup(pm->abs); if (lilv_symlink(target_path, rel_path)) { LILV_ERRORF("Failed to link `%s' => `%s' (%s)\n", @@ -933,6 +938,8 @@ lilv_state_save(LilvWorld* world, } free(target_path); free(rel_path); + free(base); + free(real_dir); } #endif @@ -1019,6 +1026,8 @@ lilv_state_save(LilvWorld* world, free(default_dir); free(default_filename); + free(manifest); + free(path); return 0; } diff --git a/src/util.c b/src/util.c index a693d2d..47846da 100644 --- a/src/util.c +++ b/src/util.c @@ -170,7 +170,7 @@ lilv_expand(const char* path) if (*s == '$') { // Hit $ (variable reference, e.g. $VAR_NAME) for (const char* t = s + 1; ; ++t) { - if (!*t || !isupper(*t) || !isdigit(*t) || *t != '_') { + if (!*t || (!isupper(*t) && !isdigit(*t) && *t != '_')) { // Append preceding chunk out = strappend(out, &len, start, s - start); @@ -309,14 +309,16 @@ char* lilv_path_join(const char* a, const char* b) { const size_t a_len = strlen(a); - const size_t b_len = strlen(b); + const size_t b_len = b ? strlen(b) : 0; const size_t pre_len = a_len - (lilv_is_dir_sep(a[a_len - 1]) ? 1 : 0); char* path = (char*)calloc(1, a_len + b_len + 2); memcpy(path, a, pre_len); path[pre_len] = LILV_DIR_SEP[0]; - memcpy(path + pre_len + 1, - b + (lilv_is_dir_sep(b[0]) ? 1 : 0), - lilv_is_dir_sep(b[0]) ? b_len - 1 : b_len); + if (b) { + memcpy(path + pre_len + 1, + b + (lilv_is_dir_sep(b[0]) ? 1 : 0), + lilv_is_dir_sep(b[0]) ? b_len - 1 : b_len); + } return path; } @@ -371,6 +373,7 @@ lilv_get_latest_copy(const char* path) lilv_dir_for_each(dirname, &latest, update_latest); free(latest.pattern); + free(dirname); return latest.latest; } -- cgit v1.2.1