diff options
-rw-r--r-- | Build/source/texk/kpathsea/ChangeLog | 8 | ||||
-rw-r--r-- | Build/source/texk/kpathsea/progname.c | 40 |
2 files changed, 24 insertions, 24 deletions
diff --git a/Build/source/texk/kpathsea/ChangeLog b/Build/source/texk/kpathsea/ChangeLog index f7d8b724a27..32fbbfd746b 100644 --- a/Build/source/texk/kpathsea/ChangeLog +++ b/Build/source/texk/kpathsea/ChangeLog @@ -1,3 +1,11 @@ +2018-02-20 Karl Berry <karl@freefriends.org> + + * progname.c (expand_symlinks): make error message on unresolvable + symlinks less verbose. + (kpathsea_selfdir): exit(1) if name cannot be resolved, + instead of failing an assertion. Report from Enrico Gregorio, + http://tug.org/pipermail/tex-live/2018-February/041052.html + 2018-02-17 TANAKA Takuji <ttk@t-lab.opal.ne.jp> * texmf.cnf ({TEXINPUTS,BIBINPUTS,max_strings}.upbibtex): diff --git a/Build/source/texk/kpathsea/progname.c b/Build/source/texk/kpathsea/progname.c index 984fceadd6c..564aab1113a 100644 --- a/Build/source/texk/kpathsea/progname.c +++ b/Build/source/texk/kpathsea/progname.c @@ -153,8 +153,9 @@ CopyFirst (register char *a, char *b) strcat (a, StripFirst (b)); } -/* Returns NULL on error. Prints intermediate results if global - `ll_verbose' is nonzero. */ +/* Returns NULL on error, such as an unresolvable symlink. Prints + intermediate results if global `ll_verbose' is nonzero. Otherwise, + returns a pointer to a static buffer (sorry). */ #define EMPTY_STRING(s) (*(s) == 0) #define EX(s) (!EMPTY_STRING (s) && strcmp (s, "/") ? "/" : "") @@ -171,22 +172,6 @@ expand_symlinks (kpathsea kpse, char *s) struct stat st; int done; - /* Check for symlink loops. It's difficult to check for all the - possibilities ourselves, so let the kernel do it. And make it - conditional so that people can see where the infinite loop is - being caused (see engtools#1536). */ - /* There used to be a test for a variable |ll_loop| here, but - it was initialized to zero and never updated */ - if (0) { - FILE *f = fopen (s, "r"); - if (!f && errno == ELOOP) { - /* Not worried about other errors, we'll get to them in due course. */ - perror (s); - return NULL; - } - if (f) fclose (f); - } - strcpy (post, s); strcpy (pre, ""); @@ -194,7 +179,7 @@ expand_symlinks (kpathsea kpse, char *s) CopyFirst (pre, post); if (lstat (pre, &st) != 0) { - fprintf (stderr, "lstat(%s) failed ...\n", pre); + fprintf (stderr, "lstat(%s) failed: ", pre); perror (pre); return NULL; } @@ -327,14 +312,14 @@ remove_dots (kpathsea kpse, string dir) } /* Return directory ARGV0 comes from. Check PATH if ARGV0 is not - absolute. */ + absolute. If ARGV0 cannot be found (e.g., --progname=nonesuch), quit. */ string kpathsea_selfdir (kpathsea kpse, const_string argv0) { - string self = NULL; string name; string ret; + string self = NULL; if (kpathsea_absolute_p (kpse, argv0, true)) { self = xstrdup (argv0); @@ -394,16 +379,23 @@ kpathsea_selfdir (kpathsea kpse, const_string argv0) if (!self) self = concat3 (".", DIR_SEP_STRING, argv0); - name = remove_dots (kpse, expand_symlinks (kpse, self)); + /* If we can't expand symlinks (--progname=nonesuch), give up. */ + name = expand_symlinks (kpse, self); + if (!name) { + fprintf (stderr, "kpathsea: Can't get directory of program name: %s\n", + self); + exit (1); + } + + /* If we have something real, we can resolve ./ and ../ elements. */ + name = remove_dots (kpse, name); #ifndef AMIGA free (self); #endif ret = xdirname (name); - free (name); - return ret; } |