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>
master
Benno Schulenberg 2016-04-15 12:27:48 +02:00
parent 6414f9f000
commit ff1bf88562
1 changed files with 5 additions and 4 deletions

View File

@ -1409,6 +1409,8 @@ void do_insertfile_void(void)
* able to go there. */ * able to go there. */
char *get_full_path(const char *origpath) char *get_full_path(const char *origpath)
{ {
int attempts = 0;
/* How often we've tried climing back up the tree. */
struct stat fileinfo; struct stat fileinfo;
char *d_here, *d_there, *d_there_file = NULL; char *d_here, *d_there, *d_there_file = NULL;
const char *last_slash; const char *last_slash;
@ -1422,11 +1424,10 @@ char *get_full_path(const char *origpath)
* current directory. */ * current directory. */
d_here = getcwd(NULL, PATH_MAX + 1); d_here = getcwd(NULL, PATH_MAX + 1);
while (d_here == NULL) { while (d_here == NULL && attempts < 20) {
if (chdir("..") == -1) IGNORE_CALL_RESULT(chdir(".."));
break;
d_here = getcwd(NULL, PATH_MAX + 1); d_here = getcwd(NULL, PATH_MAX + 1);
attempts++;
} }
/* If we succeeded, canonicalize it in d_here. */ /* If we succeeded, canonicalize it in d_here. */