diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2012-05-03 01:03:08 +0200 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2012-05-03 01:08:46 +0200 |
commit | 4e290e48b218dd7a077b38ad6605ee78d54e4d20 (patch) | |
tree | c71be98b400d83306fbba7395e82dd7eee49b127 /lib | |
parent | 6b426a2edd69364c095c1208171410cd29ccbd15 (diff) | |
download | android-node-v8-4e290e48b218dd7a077b38ad6605ee78d54e4d20.tar.gz android-node-v8-4e290e48b218dd7a077b38ad6605ee78d54e4d20.tar.bz2 android-node-v8-4e290e48b218dd7a077b38ad6605ee78d54e4d20.zip |
fs: fix file descriptor leak in sync functions
Fixes #3202.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/fs.js | 50 |
1 files changed, 24 insertions, 26 deletions
@@ -159,17 +159,19 @@ fs.readFileSync = function(path, encoding) { var nread = 0; var lastRead = 0; - do { - if (lastRead) { - buffer._bytesRead = lastRead; - nread += lastRead; - buffers.push(buffer); - } - var buffer = new Buffer(4048); - lastRead = fs.readSync(fd, buffer, 0, buffer.length, null); - } while (lastRead > 0); - - fs.closeSync(fd); + try { + do { + if (lastRead) { + buffer._bytesRead = lastRead; + nread += lastRead; + buffers.push(buffer); + } + var buffer = new Buffer(4048); + lastRead = fs.readSync(fd, buffer, 0, buffer.length, null); + } while (lastRead > 0); + } finally { + fs.closeSync(fd); + } if (buffers.length > 1) { var offset = 0; @@ -680,11 +682,13 @@ fs.writeFileSync = function(path, data, encoding) { } var written = 0; var length = data.length; - //writeSync(fd, buffer, offset, length, position) - while (written < length) { - written += fs.writeSync(fd, data, written, length - written, written); + try { + while (written < length) { + written += fs.writeSync(fd, data, written, length - written, written); + } + } finally { + fs.closeSync(fd); } - fs.closeSync(fd); }; fs.appendFile = function(path, data, encoding_, callback) { @@ -708,20 +712,14 @@ fs.appendFileSync = function(path, data, encoding) { var position = null; var length = data.length; - while (written < length) { - try { + try { + while (written < length) { written += fs.writeSync(fd, data, written, length - written, position); - } catch (e) { - try { - fs.closeSync(fd); - } catch (e) { - // swallow exception - } - throw e; + position += written; // XXX not safe with multiple concurrent writers? } - position += written; + } finally { + fs.closeSync(fd); } - fs.closeSync(fd); }; function errnoException(errorno, syscall) { |