summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2012-05-03 01:03:08 +0200
committerBen Noordhuis <info@bnoordhuis.nl>2012-05-03 01:08:46 +0200
commit4e290e48b218dd7a077b38ad6605ee78d54e4d20 (patch)
treec71be98b400d83306fbba7395e82dd7eee49b127 /lib
parent6b426a2edd69364c095c1208171410cd29ccbd15 (diff)
downloadandroid-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.js50
1 files changed, 24 insertions, 26 deletions
diff --git a/lib/fs.js b/lib/fs.js
index fc1e1b830b..f52b255290 100644
--- a/lib/fs.js
+++ b/lib/fs.js
@@ -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) {