2007-08-09 Michael Snyder * make-relative-prefix.c (make_relative_prefix_1): Resource leaks. Index: make-relative-prefix.c =================================================================== RCS file: /cvs/src/src/libiberty/make-relative-prefix.c,v retrieving revision 1.10 diff -p -r1.10 make-relative-prefix.c *** make-relative-prefix.c 3 Aug 2007 19:49:44 -0000 1.10 --- make-relative-prefix.c 9 Aug 2007 22:22:56 -0000 *************** free_split_directories (char **dirs) *** 201,210 **** { int i = 0; ! while (dirs[i] != NULL) ! free (dirs[i++]); ! free ((char *) dirs); } /* Given three strings PROGNAME, BIN_PREFIX, PREFIX, return a string that gets --- 201,213 ---- { int i = 0; ! if (dirs != NULL) ! { ! while (dirs[i] != NULL) ! free (dirs[i++]); ! free ((char *) dirs); ! } } /* Given three strings PROGNAME, BIN_PREFIX, PREFIX, return a string that gets *************** static char * *** 221,231 **** 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; int prog_num, bin_num, prefix_num; int i, n, common; int needed_len; ! char *ret, *ptr, *full_progname = NULL; if (progname == NULL || bin_prefix == NULL || prefix == NULL) return NULL; --- 224,234 ---- make_relative_prefix_1 (const char *progname, const char *bin_prefix, const char *prefix, const int resolve_links) { ! 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 = NULL, *ptr, *full_progname; if (progname == NULL || bin_prefix == NULL || prefix == NULL) return NULL; *************** make_relative_prefix_1 (const char *prog *** 305,314 **** bin_dirs = split_directories (bin_prefix, &bin_num); if (bin_dirs == NULL) ! { ! free_split_directories (prog_dirs); ! return NULL; ! } /* Remove the program name from comparison of directory names. */ prog_num--; --- 308,314 ---- bin_dirs = split_directories (bin_prefix, &bin_num); if (bin_dirs == NULL) ! goto bailout; /* Remove the program name from comparison of directory names. */ prog_num--; *************** make_relative_prefix_1 (const char *prog *** 326,346 **** } 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; ! } } prefix_dirs = split_directories (prefix, &prefix_num); if (prefix_dirs == NULL) ! { ! free_split_directories (prog_dirs); ! free_split_directories (bin_dirs); ! return NULL; ! } /* Find how many directories are in common between bin_prefix & prefix. */ n = (prefix_num < bin_num) ? prefix_num : bin_num; --- 326,337 ---- } if (prog_num <= 0 || i == bin_num) ! goto bailout; } prefix_dirs = split_directories (prefix, &prefix_num); if (prefix_dirs == NULL) ! goto bailout; /* Find how many directories are in common between bin_prefix & prefix. */ n = (prefix_num < bin_num) ? prefix_num : bin_num; *************** make_relative_prefix_1 (const char *prog *** 352,363 **** /* 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; ! } /* Two passes: first figure out the size of the result string, and then construct it. */ --- 343,349 ---- /* If there are no common directories, there can be no relative prefix. */ if (common == 0) ! goto bailout; /* Two passes: first figure out the size of the result string, and then construct it. */ *************** make_relative_prefix_1 (const char *prog *** 371,377 **** ret = (char *) malloc (needed_len); if (ret == NULL) ! return NULL; /* Build up the pathnames in argv[0]. */ *ret = '\0'; --- 357,363 ---- ret = (char *) malloc (needed_len); if (ret == NULL) ! goto bailout; /* Build up the pathnames in argv[0]. */ *ret = '\0'; *************** make_relative_prefix_1 (const char *prog *** 392,397 **** --- 378,384 ---- 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);