X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=libiberty%2Fmake-relative-prefix.c;h=e3f9f920df4a2b4a8be00e88727d74a42ed46eea;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=7239e7b0bae2d98c8f201775f63ffc4073526647;hpb=dd28faae1ad5b75119da42535c27c9ff8c3635ba;p=deliverable%2Fbinutils-gdb.git diff --git a/libiberty/make-relative-prefix.c b/libiberty/make-relative-prefix.c index 7239e7b0ba..e3f9f920df 100644 --- a/libiberty/make-relative-prefix.c +++ b/libiberty/make-relative-prefix.c @@ -1,6 +1,5 @@ /* Relative (relocatable) prefix support. - Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2006, 2012 Free Software Foundation, Inc. + Copyright (C) 1987-2020 Free Software Foundation, Inc. This file is part of libiberty. @@ -123,6 +122,9 @@ split_directories (const char *name, int *ptr_num_dirs) const char *p, *q; int ch; + if (!*name) + return NULL; + /* Count the number of directories. Special case MSDOS disk names as part of the initial directory. */ p = name; @@ -233,6 +235,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, int i, n, common; int needed_len; char *ret = NULL, *ptr, *full_progname; + char *alloc_ptr = NULL; if (progname == NULL || bin_prefix == NULL || prefix == NULL) return NULL; @@ -248,14 +251,18 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, { char *startp, *endp, *nstore; size_t prefixlen = strlen (temp) + 1; + size_t len; if (prefixlen < 2) prefixlen = 2; - nstore = (char *) alloca (prefixlen + strlen (progname) + 1 + len = prefixlen + strlen (progname) + 1; #ifdef HAVE_HOST_EXECUTABLE_SUFFIX - + strlen (HOST_EXECUTABLE_SUFFIX) + len += strlen (HOST_EXECUTABLE_SUFFIX); #endif - ); + if (len < MAX_ALLOCA_SIZE) + nstore = (char *) alloca (len); + else + alloc_ptr = nstore = (char *) malloc (len); startp = endp = temp; while (1) @@ -311,12 +318,12 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, else full_progname = strdup (progname); if (full_progname == NULL) - return NULL; + goto bailout; prog_dirs = split_directories (full_progname, &prog_num); free (full_progname); if (prog_dirs == NULL) - return NULL; + goto bailout; bin_dirs = split_directories (bin_prefix, &bin_num); if (bin_dirs == NULL) @@ -394,6 +401,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, free_split_directories (prog_dirs); free_split_directories (bin_dirs); free_split_directories (prefix_dirs); + free (alloc_ptr); return ret; }