diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-02-05 03:30:48 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-02-05 03:30:48 +0100 |
commit | cf9d8d6bba5b0a713e8c0edf15499545b1dc4244 (patch) | |
tree | 21c77b2d93e4b2774aab52496231b79debcc8120 | |
parent | ac1e7a245093bb28a1a366f1e169ab50e6660c94 (diff) | |
parent | 17dff030ae4eab34c06117aef97aac0c3ad9342a (diff) | |
download | Nim-cf9d8d6bba5b0a713e8c0edf15499545b1dc4244.tar.gz |
Merge pull request #3814 from scriptum/fix-3802
Use defer in iterator to avoid possible leaks
-rw-r--r-- | lib/pure/os.nim | 8 | ||||
-rw-r--r-- | lib/system.nim | 2 |
2 files changed, 5 insertions, 5 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].} = diff --git a/lib/system.nim b/lib/system.nim index 69c6e1290..1a0a11ff0 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -2960,9 +2960,9 @@ when not defined(JS): #and not defined(nimscript): ## buffer.add(line.replace("a", "0") & '\x0A') ## writeFile(filename, buffer) var f = open(filename, bufSize=8000) + defer: close(f) var res = TaintedString(newStringOfCap(80)) while f.readLine(res): yield res - close(f) iterator lines*(f: File): TaintedString {.tags: [ReadIOEffect].} = ## Iterate over any line in the file `f`. |