Skip to content

Commit f088442

Browse files
committed
Fix for empty buffer segfault in native bindings
1 parent 587cb0a commit f088442

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed

src/binding.cc

+10-6
Original file line numberDiff line numberDiff line change
@@ -876,13 +876,17 @@ class Connection : public ObjectWrap {
876876
} else if(val->IsNull()) {
877877
paramValues[i] = NULL;
878878
} else if(val->IsObject() && Buffer::HasInstance(val)) {
879-
char *cHexString = MallocCHexString(val->ToObject());
880-
if(!cHexString) {
881-
LOG("ArgToCStringArray: OUT OF MEMORY OR SOMETHING BAD!");
882-
ReleaseCStringArray(paramValues, i-1);
883-
return 0;
879+
if(Buffer::Length(val) > 0) {
880+
char *cHexString = MallocCHexString(val->ToObject());
881+
if(!cHexString) {
882+
LOG("ArgToCStringArray: OUT OF MEMORY OR SOMETHING BAD!");
883+
ReleaseCStringArray(paramValues, i-1);
884+
return 0;
885+
}
886+
paramValues[i] = cHexString;
887+
} else {
888+
paramValues[i] = MallocCString(NanNew<String>(""));
884889
}
885-
paramValues[i] = cHexString;
886890
} else {
887891
//a paramter was not a string
888892
LOG("Parameter not a string or buffer");
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
var helper = require('../test-helper');
2+
var assert = require('assert');
3+
4+
helper.pg.connect(function(err, client, done) {
5+
if (err) throw err;
6+
7+
var c = 'CREATE TEMP TABLE posts (body TEXT)';
8+
9+
client.query(c, function(err) {
10+
if (err) throw err;
11+
12+
c = 'INSERT INTO posts (body) VALUES ($1) RETURNING *';
13+
14+
var body = new Buffer('foo');
15+
client.query(c, [body], function(err) {
16+
if (err) throw err;
17+
18+
body = new Buffer([]);
19+
client.query(c, [body], function(err, res) {
20+
done();
21+
22+
if (err) throw err;
23+
assert.equal(res.rows[0].body, '')
24+
helper.pg.end();
25+
});
26+
});
27+
});
28+
});

0 commit comments

Comments
 (0)