Skip to content

Commit defa637

Browse files
committed
dgram: fix out-of-bound memory read
1 parent fd61bfc commit defa637

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

lib/dgram.js

+6
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,12 @@ Socket.prototype.send = function(buffer,
165165
callback) {
166166
var self = this;
167167

168+
if (offset >= buffer.length)
169+
throw new Error('Offset into buffer too large');
170+
171+
if (offset + length > buffer.length)
172+
throw new Error('Offset + length beyond buffer length');
173+
168174
callback = callback || noop;
169175

170176
self._healthCheck();

src/udp_wrap.cc

+2
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,8 @@ Handle<Value> UDPWrap::DoSend(const Arguments& args, int family) {
286286

287287
size_t offset = args[1]->Uint32Value();
288288
size_t length = args[2]->Uint32Value();
289+
assert(offset < Buffer::Length(buffer_obj));
290+
assert(length <= Buffer::Length(buffer_obj) - offset);
289291

290292
SendWrap* req_wrap = new SendWrap();
291293
req_wrap->object_->SetHiddenValue(buffer_sym, buffer_obj);

test/simple/test-dgram-oob-buffer.js

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Copyright Joyent, Inc. and other Node contributors.
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a
4+
// copy of this software and associated documentation files (the
5+
// "Software"), to deal in the Software without restriction, including
6+
// without limitation the rights to use, copy, modify, merge, publish,
7+
// distribute, sublicense, and/or sell copies of the Software, and to permit
8+
// persons to whom the Software is furnished to do so, subject to the
9+
// following conditions:
10+
//
11+
// The above copyright notice and this permission notice shall be included
12+
// in all copies or substantial portions of the Software.
13+
//
14+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15+
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16+
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17+
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19+
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20+
// USE OR OTHER DEALINGS IN THE SOFTWARE.
21+
22+
// Some operating systems report errors when an UDP message is sent to an
23+
// unreachable host. This error can be reported by sendto() and even by
24+
// recvfrom(). Node should not propagate this error to the user.
25+
26+
var common = require('../common');
27+
var assert = require('assert');
28+
var dgram = require('dgram');
29+
30+
var socket = dgram.createSocket('udp4');
31+
var buf = Buffer([1,2,3,4]);
32+
33+
function ok() {}
34+
socket.send(buf, 0, 0, common.PORT, '127.0.0.1', ok); // useful? no
35+
socket.send(buf, 0, 4, common.PORT, '127.0.0.1', ok);
36+
socket.send(buf, 1, 3, common.PORT, '127.0.0.1', ok);
37+
socket.send(buf, 3, 1, common.PORT, '127.0.0.1', ok);
38+
39+
assert.throws(function() {
40+
socket.send(buf, 0, 5, common.PORT, '127.0.0.1', assert.fail);
41+
});
42+
assert.throws(function() {
43+
socket.send(buf, 2, 3, common.PORT, '127.0.0.1', assert.fail);
44+
});
45+
assert.throws(function() {
46+
socket.send(buf, 4, 0, common.PORT, '127.0.0.1', assert.fail);
47+
});
48+
assert.throws(function() {
49+
socket.send(buf, 4, 4, common.PORT, '127.0.0.1', assert.fail);
50+
});
51+
52+
socket.close(); // FIXME should not be necessary

0 commit comments

Comments
 (0)