nano

nano with my custom patches
git clone git://bsandro.tech/nano
Log | Files | Refs | README | LICENSE

commit ff1bf88562fbd7d5abb7145477cc11ab25e44d9a
parent 6414f9f000b68c4bee8a32d285fe5e4910afa44a
Author: Benno Schulenberg <bensberg@justemail.net>
Date:   Fri, 15 Apr 2016 12:27:48 +0200

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 <osm0sis@outlook.com>
Signed-off-by: Benno Schulenberg <bensberg@justemail.net>

Diffstat:
Msrc/files.c | 9+++++----
1 file changed, 5 insertions(+), 4 deletions(-)

diff --git 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. */