From 22e8af32f318dd1361ee58c34baae9f3e2fdb93f Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 24 Oct 2017 08:26:26 -0600 Subject: [PATCH] Windows: avoid loop on reparse-point cycles In Windows 10 Fall Creators Update, a OneDrive mount looks to Racket like a reparse point that refers to itself. Make Racket stop trying to resolve the path further in that case. Relevant to #1671 --- racket/src/rktio/rktio_fs.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/racket/src/rktio/rktio_fs.c b/racket/src/rktio/rktio_fs.c index 6841b46375..f78973de8f 100644 --- a/racket/src/rktio/rktio_fs.c +++ b/racket/src/rktio/rktio_fs.c @@ -349,6 +349,7 @@ static int UNC_stat(rktio_t *rktio, const char *dirname, int *flags, int *isdir, char *copy; WIN32_FILE_ATTRIBUTE_DATA fad; int len, must_be_dir = 0; + int same_path = 0; /* to give up on cyclic links */ const wchar_t *wp; if (resolved_path) @@ -420,7 +421,7 @@ static int UNC_stat(rktio_t *rktio, const char *dirname, int *flags, int *isdir, free(copy); return 0; } else { - if (GET_FF_ATTRIBS(fad) & FF_A_LINK) { + if ((GET_FF_ATTRIBS(fad) & FF_A_LINK) && !same_path) { if (islink) { *islink = 1; return 1; @@ -465,6 +466,8 @@ static int UNC_stat(rktio_t *rktio, const char *dirname, int *flags, int *isdir, if (resolved_path) *resolved_path = dirname; + same_path = !strcmp(dirname, copy); + free(dest); free(copy);