From ff1bf88562fbd7d5abb7145477cc11ab25e44d9a Mon Sep 17 00:00:00 2001 From: Benno Schulenberg Date: Fri, 15 Apr 2016 12:27:48 +0200 Subject: [PATCH] files: limit the number of attempts at climbing up the directory tree Doing a chdir("..") will not fail when the root directory is reached, and when getcwd() keeps failing too, we have no way of knowing when to stop. So, simply limit the number of attempted chdirs, to avoid getting into an endless loop. This avoids the hang in https://savannah.gnu.org/bugs/index.php?47659. Reported-by: Chris Renshaw Signed-off-by: Benno Schulenberg --- src/files.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/files.c b/src/files.c index 1492d310..9693d320 100644 --- a/src/files.c +++ b/src/files.c @@ -1409,6 +1409,8 @@ void do_insertfile_void(void) * able to go there. */ char *get_full_path(const char *origpath) { + int attempts = 0; + /* How often we've tried climing back up the tree. */ struct stat fileinfo; char *d_here, *d_there, *d_there_file = NULL; const char *last_slash; @@ -1422,11 +1424,10 @@ char *get_full_path(const char *origpath) * current directory. */ d_here = getcwd(NULL, PATH_MAX + 1); - while (d_here == NULL) { - if (chdir("..") == -1) - break; - + while (d_here == NULL && attempts < 20) { + IGNORE_CALL_RESULT(chdir("..")); d_here = getcwd(NULL, PATH_MAX + 1); + attempts++; } /* If we succeeded, canonicalize it in d_here. */