Skip to content

Commit

Permalink
fs: properly handle fd passed to truncate()
Browse files Browse the repository at this point in the history
Currently, fs.truncate() silently fails when a file descriptor
is passed as the first argument. This commit changes this
behavior to properly call fs.ftruncate().

PR-URL: nodejs/node-v0.x-archive#9161
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Timothy J Fontaine <tjfontaine@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>

Conflicts:
	lib/fs.js
  • Loading branch information
bjouhier authored and cjihrig committed Feb 21, 2015
1 parent 4fcbb8a commit c82e580
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 4 deletions.
3 changes: 2 additions & 1 deletion doc/api/fs.markdown
Expand Up @@ -106,7 +106,8 @@ Synchronous ftruncate(2).
## fs.truncate(path, len, callback)

Asynchronous truncate(2). No arguments other than a possible exception are
given to the completion callback.
given to the completion callback. A file descriptor can also be passed as the
first argument. In this case, `fs.ftruncate()` is called.

## fs.truncateSync(path, len)

Expand Down
4 changes: 1 addition & 3 deletions lib/fs.js
Expand Up @@ -679,9 +679,7 @@ fs.renameSync = function(oldPath, newPath) {

fs.truncate = function(path, len, callback) {
if (typeof path === 'number') {
var req = new FSReqWrap();
req.oncomplete = callback;
return fs.ftruncate(path, len, req);
return fs.ftruncate(path, len, callback);
}
if (typeof len === 'function') {
callback = len;
Expand Down
25 changes: 25 additions & 0 deletions test/parallel/test-fs-truncate-fd.js
@@ -0,0 +1,25 @@
var common = require('../common');
var assert = require('assert');
var path = require('path');
var fs = require('fs');
var tmp = common.tmpDir;
if (!fs.existsSync(tmp))
fs.mkdirSync(tmp);
var filename = path.resolve(tmp, 'truncate-file.txt');

var success = 0;

fs.writeFileSync(filename, 'hello world', 'utf8');
var fd = fs.openSync(filename, 'r+');
fs.truncate(fd, 5, function(err) {
assert.ok(!err);
assert.equal(fs.readFileSync(filename, 'utf8'), 'hello');
success++;
});

process.on('exit', function() {
fs.closeSync(fd);
fs.unlinkSync(filename);
assert.equal(success, 1);
console.log('ok');
});

0 comments on commit c82e580

Please sign in to comment.