Skip to content

Commit 6cb49b6

Browse files
committed
Merge pull request brianc#675 from brianc/issues/675
Postgres Native bindings Segfault when querying with empty buffer
2 parents 587cb0a + c21dcfb commit 6cb49b6

File tree

3 files changed

+40
-6
lines changed

3 files changed

+40
-6
lines changed

.travis.yml

+2
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@ node_js:
33
- "0.10"
44
before_script:
55
- node script/create-test-tables.js pg://postgres@127.0.0.1:5432/postgres
6+
env:
7+
- PGUSER=postgres PGDATABASE=postgres

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)