diff options
author | Pavel Roschin <roshin@scriptumplus.ru> | 2016-02-02 23:20:39 +0300 |
---|---|---|
committer | Pavel Roschin <roshin@scriptumplus.ru> | 2016-02-02 23:20:39 +0300 |
commit | 17dff030ae4eab34c06117aef97aac0c3ad9342a (patch) | |
tree | d7620acb99ed6416b8f07e227d1214f6e735951a /lib/pure | |
parent | 3e33084da7ed51818335ba785c2de837a4d653db (diff) | |
download | Nim-17dff030ae4eab34c06117aef97aac0c3ad9342a.tar.gz |
Use defer in iterator to avoid possible leaks. Fixes #3802
Diffstat (limited to 'lib/pure')
-rw-r--r-- | lib/pure/os.nim | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 1e00f92b1..a92b74484 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -774,6 +774,7 @@ iterator walkFiles*(pattern: string): string {.tags: [ReadDirEffect].} = res: int res = findFirstFile(pattern, f) if res != -1: + defer: findClose(res) while true: if not skipFindData(f) and (f.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) == 0'i32: @@ -786,7 +787,6 @@ iterator walkFiles*(pattern: string): string {.tags: [ReadDirEffect].} = pattern[dotPos+1] == '*': yield splitFile(pattern).dir / extractFilename(ff) if findNextFile(res, f) == 0'i32: break - findClose(res) else: # here we use glob var f: Glob @@ -795,11 +795,11 @@ iterator walkFiles*(pattern: string): string {.tags: [ReadDirEffect].} = f.gl_pathc = 0 f.gl_pathv = nil res = glob(pattern, 0, nil, addr(f)) + defer: globfree(addr(f)) if res == 0: for i in 0.. f.gl_pathc - 1: assert(f.gl_pathv[i] != nil) yield $f.gl_pathv[i] - globfree(addr(f)) type PathComponent* = enum ## Enumeration specifying a path component. @@ -845,6 +845,7 @@ iterator walkDir*(dir: string; relative=false): tuple[kind: PathComponent, path: var f: WIN32_FIND_DATA var h = findFirstFile(dir / "*", f) if h != -1: + defer: findClose(h) while true: var k = pcFile if not skipFindData(f): @@ -856,10 +857,10 @@ iterator walkDir*(dir: string; relative=false): tuple[kind: PathComponent, path: else: dir / extractFilename(getFilename(f)) yield (k, xx) if findNextFile(h, f) == 0'i32: break - findClose(h) else: var d = opendir(dir) if d != nil: + defer: discard closedir(d) while true: var x = readdir(d) if x == nil: break @@ -883,7 +884,6 @@ iterator walkDir*(dir: string; relative=false): tuple[kind: PathComponent, path: if S_ISDIR(s.st_mode): k = pcDir if S_ISLNK(s.st_mode): k = succ(k) yield (k, y) - discard closedir(d) iterator walkDirRec*(dir: string, filter={pcFile, pcDir}): string {. tags: [ReadDirEffect].} = |