Merge pull request #12003 from murgatroid99/node_fix_batch_argument_segfault

Node: fix segfault with incorrect status argument types
pull/12125/head
Michael Lumish 8 years ago committed by GitHub
commit 6fed5dcbb4
  1. 10
      src/node/ext/call.cc
  2. 97
      src/node/test/call_test.js

@ -260,7 +260,10 @@ class SendClientCloseOp : public Op {
class SendServerStatusOp : public Op {
public:
SendServerStatusOp() { grpc_metadata_array_init(&status_metadata); }
SendServerStatusOp() {
details = grpc_empty_slice();
grpc_metadata_array_init(&status_metadata);
}
~SendServerStatusOp() {
grpc_slice_unref(details);
DestroyMetadataArray(&status_metadata);
@ -381,7 +384,10 @@ class ReadMessageOp : public Op {
class ClientStatusOp : public Op {
public:
ClientStatusOp() { grpc_metadata_array_init(&metadata_array); }
ClientStatusOp() {
grpc_metadata_array_init(&metadata_array);
status_details = grpc_empty_slice();
}
~ClientStatusOp() {
grpc_metadata_array_destroy(&metadata_array);

@ -188,6 +188,103 @@ describe('call', function() {
}, TypeError);
});
});
describe('startBatch with message', function() {
it('should fail with null argument', function() {
var call = new grpc.Call(channel, 'method', getDeadline(1));
assert.throws(function() {
var batch = {};
batch[grpc.opType.SEND_MESSAGE] = null;
call.startBatch(batch, function(){});
}, TypeError);
});
it('should fail with numeric argument', function() {
var call = new grpc.Call(channel, 'method', getDeadline(1));
assert.throws(function() {
var batch = {};
batch[grpc.opType.SEND_MESSAGE] = 5;
call.startBatch(batch, function(){});
}, TypeError);
});
it('should fail with string argument', function() {
var call = new grpc.Call(channel, 'method', getDeadline(1));
assert.throws(function() {
var batch = {};
batch[grpc.opType.SEND_MESSAGE] = 'value';
call.startBatch(batch, function(){});
}, TypeError);
});
});
describe('startBatch with status', function() {
it('should fail without a code', function() {
var call = new grpc.Call(channel, 'method', getDeadline(1));
assert.throws(function() {
var batch = {};
batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
details: 'details string',
metadata: {}
};
call.startBatch(batch, function(){});
}, TypeError);
});
it('should fail without details', function() {
var call = new grpc.Call(channel, 'method', getDeadline(1));
assert.throws(function() {
var batch = {};
batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
code: 0,
metadata: {}
};
call.startBatch(batch, function(){});
}, TypeError);
});
it('should fail without metadata', function() {
var call = new grpc.Call(channel, 'method', getDeadline(1));
assert.throws(function() {
var batch = {};
batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
code: 0,
details: 'details string'
};
call.startBatch(batch, function(){});
}, TypeError);
});
it('should fail with incorrectly typed code argument', function() {
var call = new grpc.Call(channel, 'method', getDeadline(1));
assert.throws(function() {
var batch = {};
batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
code: 'code string',
details: 'details string',
metadata: {}
};
call.startBatch(batch, function(){});
}, TypeError);
});
it('should fail with incorrectly typed details argument', function() {
var call = new grpc.Call(channel, 'method', getDeadline(1));
assert.throws(function() {
var batch = {};
batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
code: 0,
details: 5,
metadata: {}
};
call.startBatch(batch, function(){});
}, TypeError);
});
it('should fail with incorrectly typed metadata argument', function() {
var call = new grpc.Call(channel, 'method', getDeadline(1));
assert.throws(function() {
var batch = {};
batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
code: 0,
details: 'details string',
metadata: 'abc'
};
call.startBatch(batch, function(){});
}, TypeError);
});
});
describe('cancel', function() {
it('should succeed', function() {
var call = new grpc.Call(channel, 'method', getDeadline(1));

Loading…
Cancel
Save