diff options
author | Oliver Kiddle <opk@zsh.org> | 2014-11-30 23:33:19 +0100 |
---|---|---|
committer | Oliver Kiddle <opk@zsh.org> | 2014-11-30 23:33:30 +0100 |
commit | 62aa03931753e532cbae0fa56725bb5e2a757dff (patch) | |
tree | 12b2373c90553e939369e84db18fcc7de32575e5 /Src | |
parent | 40c5e00de09066916ef42067ae21e58a5268c647 (diff) | |
download | zsh-62aa03931753e532cbae0fa56725bb5e2a757dff.tar.gz zsh-62aa03931753e532cbae0fa56725bb5e2a757dff.tar.xz zsh-62aa03931753e532cbae0fa56725bb5e2a757dff.zip |
33820: detect support for realpath() with a NULL
argument and fixes to the use of it
Diffstat (limited to 'Src')
-rw-r--r-- | Src/hist.c | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/Src/hist.c b/Src/hist.c index 083175640..7fe843a4a 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -1702,11 +1702,12 @@ int chrealpath(char **junkptr) { char *str; -#ifdef HAVE_CANONICALIZE_FILE_NAME +#ifdef HAVE_REALPATH +# ifdef REALPATH_ACCEPTS_NULL char *lastpos, *nonreal, *real; -#else -# ifdef HAVE_REALPATH - char *lastpos, *nonreal, real[PATH_MAX]; +# else + char *lastpos, *nonreal, pathbuf[PATH_MAX]; + char *real = pathbuf; # endif #endif @@ -1717,7 +1718,7 @@ chrealpath(char **junkptr) if (!chabspath(junkptr)) return 0; -#if !defined(HAVE_REALPATH) && !defined(HAVE_CANONICALIZE_FILE_NAME) +#ifndef HAVE_REALPATH return 1; #else /* @@ -1733,29 +1734,21 @@ chrealpath(char **junkptr) nonreal = lastpos + 1; while (! -#ifdef HAVE_CANONICALIZE_FILE_NAME - /* - * This is a GNU extension to realpath(); it's the - * same as calling realpath() with a NULL second argument - * which uses malloc() to get memory. The alternative - * interface is easier to test for, however. - */ - (real = canonicalize_file_name(*junkptr)) +#ifdef REALPATH_ACCEPTS_NULL + /* realpath() with a NULL second argument uses malloc() to get + * memory so we don't need to worry about overflowing PATH_MAX */ + (real = realpath(*junkptr, NULL)) #else realpath(*junkptr, real) #endif ) { - if (errno == EINVAL || errno == ELOOP || - errno == ENAMETOOLONG || errno == ENOMEM) - return 0; - -#ifdef HAVE_CANONICALIZE_FILE_NAME - if (!real) + if (errno == EINVAL || errno == ENOMEM) return 0; -#endif if (nonreal == *junkptr) { - *real = '\0'; +#ifndef REALPATH_ACCEPTS_NULL + real = NULL; +#endif break; } @@ -1771,11 +1764,15 @@ chrealpath(char **junkptr) str++; } - *junkptr = metafy(str = bicat(real, nonreal), -1, META_HEAPDUP); - zsfree(str); -#ifdef HAVE_CANONICALIZE_FILE_NAME - free(real); + if (real) { + *junkptr = metafy(str = bicat(real, nonreal), -1, META_HEAPDUP); + zsfree(str); +#ifdef REALPATH_ACCEPTS_NULL + free(real); #endif + } else { + *junkptr = metafy(nonreal, lastpos - nonreal + 1, META_HEAPDUP); + } #endif return 1; |