diff options
author | DJ Delorie <dj@redhat.com> | 2007-08-17 19:31:01 +0000 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2007-08-17 19:31:01 +0000 |
commit | cefec4092d6c88bb538f85769b464dea126ec274 (patch) | |
tree | ac03b06e83ab669659e69e18921e2d4050c37afe /libiberty | |
parent | 198757a8b19977e7d4bb048dac03fb207ce228ac (diff) | |
download | gdb-cefec4092d6c88bb538f85769b464dea126ec274.zip gdb-cefec4092d6c88bb538f85769b464dea126ec274.tar.gz gdb-cefec4092d6c88bb538f85769b464dea126ec274.tar.bz2 |
merge from gcc
Diffstat (limited to 'libiberty')
-rw-r--r-- | libiberty/ChangeLog | 4 | ||||
-rw-r--r-- | libiberty/make-relative-prefix.c | 41 |
2 files changed, 18 insertions, 27 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 28e2c4f..11e9082 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,7 @@ +2007-08-17 Michael Snyder <msnyder@access-company.com> + + * make-relative-prefix.c (make_relative_prefix_1): Resource leaks. + 2007-08-03 Michael Snyder <msnyder@access-company.com> * make-relative-prefix.c (make_relative_prefix_1): Fix resource diff --git a/libiberty/make-relative-prefix.c b/libiberty/make-relative-prefix.c index be61040..80e7f92 100644 --- a/libiberty/make-relative-prefix.c +++ b/libiberty/make-relative-prefix.c @@ -201,10 +201,13 @@ free_split_directories (char **dirs) { int i = 0; - while (dirs[i] != NULL) - free (dirs[i++]); + if (dirs != NULL) + { + while (dirs[i] != NULL) + free (dirs[i++]); - free ((char *) dirs); + free ((char *) dirs); + } } /* Given three strings PROGNAME, BIN_PREFIX, PREFIX, return a string that gets @@ -221,11 +224,11 @@ static char * make_relative_prefix_1 (const char *progname, const char *bin_prefix, const char *prefix, const int resolve_links) { - char **prog_dirs, **bin_dirs, **prefix_dirs; + char **prog_dirs = NULL, **bin_dirs = NULL, **prefix_dirs = NULL; int prog_num, bin_num, prefix_num; int i, n, common; int needed_len; - char *ret, *ptr, *full_progname = NULL; + char *ret = NULL, *ptr, *full_progname; if (progname == NULL || bin_prefix == NULL || prefix == NULL) return NULL; @@ -305,10 +308,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, bin_dirs = split_directories (bin_prefix, &bin_num); if (bin_dirs == NULL) - { - free_split_directories (prog_dirs); - return NULL; - } + goto bailout; /* Remove the program name from comparison of directory names. */ prog_num--; @@ -326,21 +326,12 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, } if (prog_num <= 0 || i == bin_num) - { - free_split_directories (prog_dirs); - free_split_directories (bin_dirs); - prog_dirs = bin_dirs = (char **) 0; - return NULL; - } + goto bailout; } prefix_dirs = split_directories (prefix, &prefix_num); if (prefix_dirs == NULL) - { - free_split_directories (prog_dirs); - free_split_directories (bin_dirs); - return NULL; - } + goto bailout; /* Find how many directories are in common between bin_prefix & prefix. */ n = (prefix_num < bin_num) ? prefix_num : bin_num; @@ -352,12 +343,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, /* If there are no common directories, there can be no relative prefix. */ if (common == 0) - { - free_split_directories (prog_dirs); - free_split_directories (bin_dirs); - free_split_directories (prefix_dirs); - return NULL; - } + goto bailout; /* Two passes: first figure out the size of the result string, and then construct it. */ @@ -371,7 +357,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, ret = (char *) malloc (needed_len); if (ret == NULL) - return NULL; + goto bailout; /* Build up the pathnames in argv[0]. */ *ret = '\0'; @@ -392,6 +378,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, for (i = common; i < prefix_num; i++) strcat (ret, prefix_dirs[i]); + bailout: free_split_directories (prog_dirs); free_split_directories (bin_dirs); free_split_directories (prefix_dirs); |