From e98a2051ce22c1f72c662e0c3e37597cbfaad6b0 Mon Sep 17 00:00:00 2001 From: oskca Date: Wed, 10 Jan 2018 23:20:18 +0800 Subject: [PATCH 1/4] check ERROR_NO_MORE_FILES to prevent walkDir[Rec] to quit prematurely --- lib/pure/os.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pure/os.nim b/lib/pure/os.nim index c18d03289..689fc8d4a 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -672,7 +672,7 @@ template walkCommon(pattern: string, filter) = if dotPos < 0 or idx >= ff.len or ff[idx] == '.' or pattern[dotPos+1] == '*': yield splitFile(pattern).dir / extractFilename(ff) - if findNextFile(res, f) == 0'i32: break + if findNextFile(res, f) == 0'i32 and getLastError() == 18: break # ERROR_NO_MORE_FILES=18 else: # here we use glob var f: Glob @@ -782,7 +782,7 @@ iterator walkDir*(dir: string; relative=false): tuple[kind: PathComponent, path: let xx = if relative: extractFilename(getFilename(f)) else: dir / extractFilename(getFilename(f)) yield (k, xx) - if findNextFile(h, f) == 0'i32: break + if findNextFile(h, f) == 0'i32 and getLastError() == 18: break # ERROR_NO_MORE_FILES=18 else: var d = opendir(dir) if d != nil: From 495331bf20d5c3147290f0393581c4bd7292c89c Mon Sep 17 00:00:00 2001 From: oskca Date: Thu, 11 Jan 2018 13:40:25 +0800 Subject: [PATCH 2/4] raiseOSError to indicate the failling of findNextFile in walkDir[Rec] --- lib/pure/os.nim | 10 ++++++++-- lib/windows/winlean.nim | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 689fc8d4a..1e3224537 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -672,7 +672,10 @@ template walkCommon(pattern: string, filter) = if dotPos < 0 or idx >= ff.len or ff[idx] == '.' or pattern[dotPos+1] == '*': yield splitFile(pattern).dir / extractFilename(ff) - if findNextFile(res, f) == 0'i32 and getLastError() == 18: break # ERROR_NO_MORE_FILES=18 + if findNextFile(res, f) == 0'i32: + let errCode = getLastError() + if errCode == ERROR_NO_MORE_FILES: break + else: raiseOSError(errCode, "findNextFile failed") else: # here we use glob var f: Glob @@ -782,7 +785,10 @@ iterator walkDir*(dir: string; relative=false): tuple[kind: PathComponent, path: let xx = if relative: extractFilename(getFilename(f)) else: dir / extractFilename(getFilename(f)) yield (k, xx) - if findNextFile(h, f) == 0'i32 and getLastError() == 18: break # ERROR_NO_MORE_FILES=18 + if findNextFile(res, f) == 0'i32: + let errCode = getLastError() + if errCode == ERROR_NO_MORE_FILES: break + else: raiseOSError(errCode, "findNextFile failed") else: var d = opendir(dir) if d != nil: diff --git a/lib/windows/winlean.nim b/lib/windows/winlean.nim index a833377e5..bd6e58a10 100644 --- a/lib/windows/winlean.nim +++ b/lib/windows/winlean.nim @@ -686,6 +686,7 @@ const ERROR_FILE_NOT_FOUND* = 2 ERROR_PATH_NOT_FOUND* = 3 ERROR_ACCESS_DENIED* = 5 + ERROR_NO_MORE_FILES* = 18 ERROR_HANDLE_EOF* = 38 ERROR_BAD_ARGUMENTS* = 165 From c9c44a4eb9d294ca1a0fe36e964536431b198035 Mon Sep 17 00:00:00 2001 From: oskca Date: Thu, 11 Jan 2018 19:42:19 +0800 Subject: [PATCH 3/4] correct type for raiseOSError --- lib/pure/os.nim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 1e3224537..9d6dc4f80 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -675,7 +675,7 @@ template walkCommon(pattern: string, filter) = if findNextFile(res, f) == 0'i32: let errCode = getLastError() if errCode == ERROR_NO_MORE_FILES: break - else: raiseOSError(errCode, "findNextFile failed") + else: raiseOSError(errCode.OSErrorCode, "findNextFile failed") else: # here we use glob var f: Glob @@ -785,10 +785,10 @@ iterator walkDir*(dir: string; relative=false): tuple[kind: PathComponent, path: let xx = if relative: extractFilename(getFilename(f)) else: dir / extractFilename(getFilename(f)) yield (k, xx) - if findNextFile(res, f) == 0'i32: + if findNextFile(h, f) == 0'i32: let errCode = getLastError() if errCode == ERROR_NO_MORE_FILES: break - else: raiseOSError(errCode, "findNextFile failed") + else: raiseOSError(errCode.OSErrorCode, "findNextFile failed") else: var d = opendir(dir) if d != nil: From 8da96bc72bb17e9adddee52cb95393f4d6deef29 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Thu, 11 Jan 2018 12:16:34 +0000 Subject: [PATCH 4/4] Remove additionalInfo in OSError in findNextFile --- lib/pure/os.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 9d6dc4f80..a5db4ed22 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -675,7 +675,7 @@ template walkCommon(pattern: string, filter) = if findNextFile(res, f) == 0'i32: let errCode = getLastError() if errCode == ERROR_NO_MORE_FILES: break - else: raiseOSError(errCode.OSErrorCode, "findNextFile failed") + else: raiseOSError(errCode.OSErrorCode) else: # here we use glob var f: Glob @@ -788,7 +788,7 @@ iterator walkDir*(dir: string; relative=false): tuple[kind: PathComponent, path: if findNextFile(h, f) == 0'i32: let errCode = getLastError() if errCode == ERROR_NO_MORE_FILES: break - else: raiseOSError(errCode.OSErrorCode, "findNextFile failed") + else: raiseOSError(errCode.OSErrorCode) else: var d = opendir(dir) if d != nil: