Merge remote-tracking branch 'origin/v0.8'
Conflicts: deps/uv/include/uv.h src/node_crypto.cc
This commit is contained in:
commit
972cdf82f1
4
Makefile
4
Makefile
@ -22,11 +22,11 @@ endif
|
|||||||
# to check for changes.
|
# to check for changes.
|
||||||
.PHONY: node node_g
|
.PHONY: node node_g
|
||||||
|
|
||||||
node: config.gypi
|
node: config.gypi out/Makefile
|
||||||
$(MAKE) -C out BUILDTYPE=Release V=$(V)
|
$(MAKE) -C out BUILDTYPE=Release V=$(V)
|
||||||
ln -fs out/Release/node node
|
ln -fs out/Release/node node
|
||||||
|
|
||||||
node_g: config.gypi
|
node_g: config.gypi out/Makefile
|
||||||
$(MAKE) -C out BUILDTYPE=Debug V=$(V)
|
$(MAKE) -C out BUILDTYPE=Debug V=$(V)
|
||||||
ln -fs out/Debug/node node_g
|
ln -fs out/Debug/node node_g
|
||||||
|
|
||||||
|
@ -3,7 +3,13 @@ Evented I/O for V8 javascript. [:
|
||||||
|
|
||||||
|
* Python 2.6 or 2.7
|
||||||
|
* GNU Make 3.81 or newer
|
||||||
|
* libexecinfo (FreeBSD and OpenBSD only)
|
||||||
|
|
||||||
|
Unix/Macintosh:
|
||||||
|
|
||||||
./configure
|
./configure
|
||||||
make
|
make
|
||||||
|
@ -357,7 +357,7 @@ the worker finally die.
|
|||||||
|
|
||||||
Because there might be long living connections, it is useful to implement a timeout.
|
Because there might be long living connections, it is useful to implement a timeout.
|
||||||
This example ask the worker to disconnect and after 2 seconds it will destroy the
|
This example ask the worker to disconnect and after 2 seconds it will destroy the
|
||||||
server. An alternative wound be to execute `worker.destroy()` after 2 seconds, but
|
server. An alternative would be to execute `worker.destroy()` after 2 seconds, but
|
||||||
that would normally not allow the worker to do any cleanup if needed.
|
that would normally not allow the worker to do any cleanup if needed.
|
||||||
|
|
||||||
if (cluster.isMaster) {
|
if (cluster.isMaster) {
|
||||||
|
@ -354,7 +354,7 @@ which has been transmitted are equal or not.
|
|||||||
### response.statusCode
|
### response.statusCode
|
||||||
|
|
||||||
When using implicit headers (not calling `response.writeHead()` explicitly), this property
|
When using implicit headers (not calling `response.writeHead()` explicitly), this property
|
||||||
controls the status code that will be send to the client when the headers get
|
controls the status code that will be sent to the client when the headers get
|
||||||
flushed.
|
flushed.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
@ -452,7 +452,7 @@ emit trailers, with a list of the header fields in its value. E.g.,
|
|||||||
### response.end([data], [encoding])
|
### response.end([data], [encoding])
|
||||||
|
|
||||||
This method signals to the server that all of the response headers and body
|
This method signals to the server that all of the response headers and body
|
||||||
has been sent; that server should consider this message complete.
|
have been sent; that server should consider this message complete.
|
||||||
The method, `response.end()`, MUST be called on each
|
The method, `response.end()`, MUST be called on each
|
||||||
response.
|
response.
|
||||||
|
|
||||||
|
116
doc/blog/release/v0.9.1.md
Normal file
116
doc/blog/release/v0.9.1.md
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
version: 0.9.1
|
||||||
|
title: Version 0.9.1 (Unstable)
|
||||||
|
category: release
|
||||||
|
slug: node-v0-9-1-unstable
|
||||||
|
date: 2012-08-28T22:33:45.659Z
|
||||||
|
|
||||||
|
2012.08.28, Version 0.9.1 (Unstable)
|
||||||
|
|
||||||
|
* buffer: Add Buffer.isEncoding(enc) to test for valid encoding values (isaacs)
|
||||||
|
|
||||||
|
* Raise UV_ECANCELED on premature close. (Ben Noordhuis)
|
||||||
|
|
||||||
|
* Remove c-ares from libuv, move to a top-level node dependency (Bert Belder)
|
||||||
|
|
||||||
|
* ref/unref for all HandleWraps, timers, servers, and sockets (Timothy J Fontaine)
|
||||||
|
|
||||||
|
* addon: remove node-waf, superseded by node-gyp (Ben Noordhuis)
|
||||||
|
|
||||||
|
* child_process: emit error on exec failure (Ben Noordhuis)
|
||||||
|
|
||||||
|
* cluster: do not use internal server API (Andreas Madsen)
|
||||||
|
|
||||||
|
* constants: add O_DIRECT (Ian Babrou)
|
||||||
|
|
||||||
|
* crypto: add sync interface to crypto.pbkdf2() (Ben Noordhuis)
|
||||||
|
|
||||||
|
* darwin: emulate fdatasync() (Fedor Indutny)
|
||||||
|
|
||||||
|
* dgram: make .bind() always asynchronous (Ben Noordhuis)
|
||||||
|
|
||||||
|
* events: Make emitter.listeners() side-effect free (isaacs, Joe Andaverde)
|
||||||
|
|
||||||
|
* fs: Throw early on invalid encoding args (isaacs)
|
||||||
|
|
||||||
|
* fs: fix naming of truncate/ftruncate functions (isaacs)
|
||||||
|
|
||||||
|
* http: bubble up parser errors to ClientRequest (Brian White)
|
||||||
|
|
||||||
|
* linux: improve cpuinfo parser on ARM and MIPS (Ben Noordhuis)
|
||||||
|
|
||||||
|
* net: add support for IPv6 addresses ending in :: (Josh Erickson)
|
||||||
|
|
||||||
|
* net: support Server.listen(Pipe) (Andreas Madsen)
|
||||||
|
|
||||||
|
* node: don't scan add-on for "init" symbol (Ben Noordhuis)
|
||||||
|
|
||||||
|
* remove process.uvCounters() (Ben Noordhuis)
|
||||||
|
|
||||||
|
* repl: console writes to repl rather than process stdio (Nathan Rajlich)
|
||||||
|
|
||||||
|
* timers: implement setImmediate (Timothy J Fontaine)
|
||||||
|
|
||||||
|
* tls: fix segfault in pummel/test-tls-ci-reneg-attack (Ben Noordhuis)
|
||||||
|
|
||||||
|
* tools: Move gyp addon tools to node-gyp (Nathan Rajlich)
|
||||||
|
|
||||||
|
* unix: preliminary signal handler support (Ben Noordhuis)
|
||||||
|
|
||||||
|
* unix: remove dependency on ev_child (Ben Noordhuis)
|
||||||
|
|
||||||
|
* unix: work around darwin bug, don't poll() on pipe (Fedor Indutny)
|
||||||
|
|
||||||
|
* util: Formally deprecate util.pump() (Ben Noordhuis)
|
||||||
|
|
||||||
|
* windows: make active and closing handle state independent (Bert Belder)
|
||||||
|
|
||||||
|
* windows: report spawn errors to the exit callback (Bert Belder)
|
||||||
|
|
||||||
|
* windows: signal handling support with uv_signal_t (Bert Belder)
|
||||||
|
|
||||||
|
|
||||||
|
Source Code: http://nodejs.org/dist/v0.9.1/node-v0.9.1.tar.gz
|
||||||
|
|
||||||
|
Macintosh Installer (Universal): http://nodejs.org/dist/v0.9.1/node-v0.9.1.pkg
|
||||||
|
|
||||||
|
Windows Installer: http://nodejs.org/dist/v0.9.1/node-v0.9.1-x86.msi
|
||||||
|
|
||||||
|
Windows x64 Installer: http://nodejs.org/dist/v0.9.1/x64/node-v0.9.1-x64.msi
|
||||||
|
|
||||||
|
Windows x64 Files: http://nodejs.org/dist/v0.9.1/x64/
|
||||||
|
|
||||||
|
Linux 32-bit Binary: http://nodejs.org/dist/v0.9.1/node-v0.9.1-linux-x86.tar.gz
|
||||||
|
|
||||||
|
Linux 64-bit Binary: http://nodejs.org/dist/v0.9.1/node-v0.9.1-linux-x64.tar.gz
|
||||||
|
|
||||||
|
Solaris 32-bit Binary: http://nodejs.org/dist/v0.9.1/node-v0.9.1-sunos-x86.tar.gz
|
||||||
|
|
||||||
|
Solaris 64-bit Binary: http://nodejs.org/dist/v0.9.1/node-v0.9.1-sunos-x64.tar.gz
|
||||||
|
|
||||||
|
Other release files: http://nodejs.org/dist/v0.9.1/
|
||||||
|
|
||||||
|
Website: http://nodejs.org/docs/v0.9.1/
|
||||||
|
|
||||||
|
Documentation: http://nodejs.org/docs/v0.9.1/api/
|
||||||
|
|
||||||
|
Shasums:
|
||||||
|
|
||||||
|
```
|
||||||
|
b86a5b0b2c9a89d08baaeb3d5270a8f247b4ba43 node-v0.9.1-darwin-x64.tar.gz
|
||||||
|
800af9d15a4b65e624351bb94dedc3b7eb322b86 node-v0.9.1-darwin-x86.tar.gz
|
||||||
|
a7ea43b0db472ca84dc9838960dae57ff0abaa72 node-v0.9.1-linux-x64.tar.gz
|
||||||
|
89c4be492a946eefa45aa87d16787875aa0f2dff node-v0.9.1-linux-x86.tar.gz
|
||||||
|
6495d2814541e945dba5941b8d3facf2a61dc55d node-v0.9.1-sunos-x64.tar.gz
|
||||||
|
05ea83ba4d648f5b949833bb28d69e6eeebabb78 node-v0.9.1-sunos-x86.tar.gz
|
||||||
|
3ccf1ac2fea7f2d05bcaed590bc54ee61c982fbb node-v0.9.1-x86.msi
|
||||||
|
bd0ede40e4681b16088284fe6a18ae3a5c5a3795 node-v0.9.1.tar.gz
|
||||||
|
159470a999ef23fa940ad3c54265053c3d2a4332 node.exe
|
||||||
|
02472e388a44b91e2644178a0fe011354fcd361e node.exp
|
||||||
|
c6d6ce22be4b47ad022d82dd91ebd4c040742fee node.lib
|
||||||
|
7b4cec8b4106d90a077388fe483fdbb13119dcb1 node.pdb
|
||||||
|
a5fbf5e22c7623a9206abc6608d084ff53c7c4c9 x64/node-v0.9.1-x64.msi
|
||||||
|
9755685a9d7bea6dc63d3260829c26c5b0430a7a x64/node.exe
|
||||||
|
621f177733647848f7f667926fe4f498a1f50c97 x64/node.exp
|
||||||
|
5877dffbf012c458dab88f3392af59cb33720d2f x64/node.lib
|
||||||
|
dc513ce5c16771dcfab9c1777d5949252290b412 x64/node.pdb
|
||||||
|
```
|
@ -300,6 +300,9 @@ function setupChannel(target, channel) {
|
|||||||
} else {
|
} else {
|
||||||
this.buffering = false;
|
this.buffering = false;
|
||||||
target.disconnect();
|
target.disconnect();
|
||||||
|
channel.onread = nop;
|
||||||
|
channel.close();
|
||||||
|
maybeClose(target);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -755,7 +758,7 @@ ChildProcess.prototype.spawn = function(options) {
|
|||||||
ipc = createPipe(true);
|
ipc = createPipe(true);
|
||||||
ipcFd = i;
|
ipcFd = i;
|
||||||
|
|
||||||
acc.push({ type: 'pipe', handle: ipc });
|
acc.push({ type: 'pipe', handle: ipc, ipc: true });
|
||||||
} else if (typeof stdio === 'number' || typeof stdio.fd === 'number') {
|
} else if (typeof stdio === 'number' || typeof stdio.fd === 'number') {
|
||||||
acc.push({ type: 'fd', fd: stdio.fd || stdio });
|
acc.push({ type: 'fd', fd: stdio.fd || stdio });
|
||||||
} else if (getHandleWrapType(stdio) || getHandleWrapType(stdio.handle) ||
|
} else if (getHandleWrapType(stdio) || getHandleWrapType(stdio.handle) ||
|
||||||
@ -806,6 +809,11 @@ ChildProcess.prototype.spawn = function(options) {
|
|||||||
stdio.forEach(function(stdio, i) {
|
stdio.forEach(function(stdio, i) {
|
||||||
if (stdio.type === 'ignore') return;
|
if (stdio.type === 'ignore') return;
|
||||||
|
|
||||||
|
if (stdio.ipc) {
|
||||||
|
self._closesNeeded++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (stdio.handle) {
|
if (stdio.handle) {
|
||||||
// when i === 0 - we're dealing with stdin
|
// when i === 0 - we're dealing with stdin
|
||||||
// (which is the only one writable pipe)
|
// (which is the only one writable pipe)
|
||||||
|
@ -106,6 +106,7 @@ function normalizeConnectArgs(args) {
|
|||||||
var cb = args[args.length - 1];
|
var cb = args[args.length - 1];
|
||||||
return (typeof cb === 'function') ? [options, cb] : [options];
|
return (typeof cb === 'function') ? [options, cb] : [options];
|
||||||
}
|
}
|
||||||
|
exports._normalizeConnectArgs = normalizeConnectArgs;
|
||||||
|
|
||||||
|
|
||||||
/* called when creating new Socket, or when re-using a closed Socket */
|
/* called when creating new Socket, or when re-using a closed Socket */
|
||||||
|
49
lib/tls.js
49
lib/tls.js
@ -1217,34 +1217,24 @@ Server.prototype.SNICallback = function(servername) {
|
|||||||
// });
|
// });
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
function normalizeConnectArgs(listArgs) {
|
||||||
|
var args = net._normalizeConnectArgs(listArgs);
|
||||||
|
var options = args[0];
|
||||||
|
var cb = args[1];
|
||||||
|
|
||||||
|
if (typeof listArgs[1] === 'object') {
|
||||||
|
options = util._extend(options, listArgs[1]);
|
||||||
|
} else if (typeof listArgs[2] === 'object') {
|
||||||
|
options = util._extend(options, listArgs[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (cb) ? [options, cb] : [options];
|
||||||
|
}
|
||||||
|
|
||||||
exports.connect = function(/* [port, host], options, cb */) {
|
exports.connect = function(/* [port, host], options, cb */) {
|
||||||
var options, port, host, cb;
|
var args = normalizeConnectArgs(arguments);
|
||||||
|
var options = args[0];
|
||||||
if (typeof arguments[0] === 'object') {
|
var cb = args[1];
|
||||||
options = arguments[0];
|
|
||||||
} else if (typeof arguments[1] === 'object') {
|
|
||||||
options = arguments[1];
|
|
||||||
port = arguments[0];
|
|
||||||
} else if (typeof arguments[2] === 'object') {
|
|
||||||
options = arguments[2];
|
|
||||||
port = arguments[0];
|
|
||||||
host = arguments[1];
|
|
||||||
} else {
|
|
||||||
// This is what happens when user passes no `options` argument, we can't
|
|
||||||
// throw `TypeError` here because it would be incompatible with old API
|
|
||||||
if (typeof arguments[0] === 'number') {
|
|
||||||
port = arguments[0];
|
|
||||||
}
|
|
||||||
if (typeof arguments[1] === 'string') {
|
|
||||||
host = arguments[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
options = util._extend({ port: port, host: host }, options || {});
|
|
||||||
|
|
||||||
if (typeof arguments[arguments.length - 1] === 'function') {
|
|
||||||
cb = arguments[arguments.length - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
var socket = options.socket ? options.socket : new net.Stream();
|
var socket = options.socket ? options.socket : new net.Stream();
|
||||||
|
|
||||||
@ -1269,11 +1259,12 @@ exports.connect = function(/* [port, host], options, cb */) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!options.socket) {
|
if (!options.socket) {
|
||||||
socket.connect({
|
var connect_opt = (options.path && !options.port) ? {path: options.path} : {
|
||||||
port: options.port,
|
port: options.port,
|
||||||
host: options.host,
|
host: options.host,
|
||||||
localAddress: options.localAddress
|
localAddress: options.localAddress
|
||||||
});
|
};
|
||||||
|
socket.connect(connect_opt);
|
||||||
}
|
}
|
||||||
|
|
||||||
pair.on('secure', function() {
|
pair.on('secure', function() {
|
||||||
|
@ -560,6 +560,10 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
startup.processSignalHandlers = function() {
|
startup.processSignalHandlers = function() {
|
||||||
|
// Not supported on Windows.
|
||||||
|
if (process.platform === 'win32')
|
||||||
|
return;
|
||||||
|
|
||||||
// Load events module in order to access prototype elements on process like
|
// Load events module in order to access prototype elements on process like
|
||||||
// process.addListener.
|
// process.addListener.
|
||||||
var signalWraps = {};
|
var signalWraps = {};
|
||||||
|
@ -942,23 +942,20 @@ int Connection::SelectSNIContextCallback_(SSL *s, int *ad, void* arg) {
|
|||||||
}
|
}
|
||||||
p->servername_ = Persistent<String>::New(String::New(servername));
|
p->servername_ = Persistent<String>::New(String::New(servername));
|
||||||
|
|
||||||
// Call sniCallback_ and use it's return value as context
|
// Call the SNI callback and use its return value as context
|
||||||
if (!p->sniCallback_.IsEmpty()) {
|
if (!p->sniObject_.IsEmpty()) {
|
||||||
if (!p->sniContext_.IsEmpty()) {
|
if (!p->sniContext_.IsEmpty()) {
|
||||||
p->sniContext_.Dispose();
|
p->sniContext_.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get callback init args
|
// Get callback init args
|
||||||
Local<Value> argv[1] = {*p->servername_};
|
Local<Value> argv[1] = {*p->servername_};
|
||||||
Local<Function> callback = *p->sniCallback_;
|
|
||||||
|
|
||||||
// Call it
|
// Call it
|
||||||
//
|
Local<Value> ret = Local<Value>::New(MakeCallback(p->sniObject_,
|
||||||
// XXX There should be an object connected to this that
|
"onselect",
|
||||||
// we can attach a domain onto.
|
ARRAY_SIZE(argv),
|
||||||
Local<Value> ret;
|
argv));
|
||||||
ret = Local<Value>::New(MakeCallback(Context::GetCurrent()->Global(),
|
|
||||||
callback, ARRAY_SIZE(argv), argv));
|
|
||||||
|
|
||||||
// If ret is SecureContext
|
// If ret is SecureContext
|
||||||
if (secure_context_constructor->HasInstance(ret)) {
|
if (secure_context_constructor->HasInstance(ret)) {
|
||||||
@ -1778,11 +1775,11 @@ Handle<Value> Connection::SetSNICallback(const Arguments& args) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Release old handle
|
// Release old handle
|
||||||
if (!ss->sniCallback_.IsEmpty()) {
|
if (!ss->sniObject_.IsEmpty()) {
|
||||||
ss->sniCallback_.Dispose();
|
ss->sniObject_.Dispose();
|
||||||
}
|
}
|
||||||
ss->sniCallback_ = Persistent<Function>::New(
|
ss->sniObject_ = Persistent<Object>::New(Object::New());
|
||||||
Local<Function>::Cast(args[0]));
|
ss->sniObject_->Set(String::New("onselect"), args[0]);
|
||||||
|
|
||||||
return True();
|
return True();
|
||||||
}
|
}
|
||||||
@ -4207,7 +4204,7 @@ struct pbkdf2_req {
|
|||||||
size_t iter;
|
size_t iter;
|
||||||
char* key;
|
char* key;
|
||||||
size_t keylen;
|
size_t keylen;
|
||||||
Persistent<Function> callback;
|
Persistent<Object> obj;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -4253,13 +4250,10 @@ void EIO_PBKDF2After(uv_work_t* work_req) {
|
|||||||
|
|
||||||
HandleScope scope;
|
HandleScope scope;
|
||||||
Local<Value> argv[2];
|
Local<Value> argv[2];
|
||||||
Persistent<Function> cb = req->callback;
|
Persistent<Object> obj = req->obj;
|
||||||
EIO_PBKDF2After(req, argv);
|
EIO_PBKDF2After(req, argv);
|
||||||
|
MakeCallback(obj, "ondone", ARRAY_SIZE(argv), argv);
|
||||||
// XXX There should be an object connected to this that
|
obj.Dispose();
|
||||||
// we can attach a domain onto.
|
|
||||||
MakeCallback(Context::GetCurrent()->Global(), cb, ARRAY_SIZE(argv), argv);
|
|
||||||
cb.Dispose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4275,7 +4269,6 @@ Handle<Value> PBKDF2(const Arguments& args) {
|
|||||||
ssize_t pass_written = -1;
|
ssize_t pass_written = -1;
|
||||||
ssize_t salt_written = -1;
|
ssize_t salt_written = -1;
|
||||||
ssize_t iter = -1;
|
ssize_t iter = -1;
|
||||||
Local<Function> callback;
|
|
||||||
pbkdf2_req* req = NULL;
|
pbkdf2_req* req = NULL;
|
||||||
|
|
||||||
if (args.Length() != 4 && args.Length() != 5) {
|
if (args.Length() != 4 && args.Length() != 5) {
|
||||||
@ -4338,8 +4331,8 @@ Handle<Value> PBKDF2(const Arguments& args) {
|
|||||||
req->keylen = keylen;
|
req->keylen = keylen;
|
||||||
|
|
||||||
if (args[4]->IsFunction()) {
|
if (args[4]->IsFunction()) {
|
||||||
callback = Local<Function>::Cast(args[4]);
|
req->obj = Persistent<Object>::New(Object::New());
|
||||||
req->callback = Persistent<Function>::New(callback);
|
req->obj->Set(String::New("ondone"), args[4]);
|
||||||
uv_queue_work(uv_default_loop(),
|
uv_queue_work(uv_default_loop(),
|
||||||
&req->work_req,
|
&req->work_req,
|
||||||
EIO_PBKDF2,
|
EIO_PBKDF2,
|
||||||
@ -4364,7 +4357,7 @@ typedef int (*RandomBytesGenerator)(unsigned char* buf, int size);
|
|||||||
|
|
||||||
struct RandomBytesRequest {
|
struct RandomBytesRequest {
|
||||||
~RandomBytesRequest();
|
~RandomBytesRequest();
|
||||||
Persistent<Function> callback_;
|
Persistent<Object> obj_;
|
||||||
unsigned long error_; // openssl error code or zero
|
unsigned long error_; // openssl error code or zero
|
||||||
uv_work_t work_req_;
|
uv_work_t work_req_;
|
||||||
size_t size_;
|
size_t size_;
|
||||||
@ -4373,10 +4366,9 @@ struct RandomBytesRequest {
|
|||||||
|
|
||||||
|
|
||||||
RandomBytesRequest::~RandomBytesRequest() {
|
RandomBytesRequest::~RandomBytesRequest() {
|
||||||
if (!callback_.IsEmpty()) {
|
if (obj_.IsEmpty()) return;
|
||||||
callback_.Dispose();
|
obj_.Dispose();
|
||||||
callback_.Clear();
|
obj_.Clear();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4437,12 +4429,7 @@ void RandomBytesAfter(uv_work_t* work_req) {
|
|||||||
HandleScope scope;
|
HandleScope scope;
|
||||||
Local<Value> argv[2];
|
Local<Value> argv[2];
|
||||||
RandomBytesCheck(req, argv);
|
RandomBytesCheck(req, argv);
|
||||||
|
MakeCallback(req->obj_, "ondone", ARRAY_SIZE(argv), argv);
|
||||||
// XXX There should be an object connected to this that
|
|
||||||
// we can attach a domain onto.
|
|
||||||
MakeCallback(Context::GetCurrent()->Global(),
|
|
||||||
req->callback_,
|
|
||||||
ARRAY_SIZE(argv), argv);
|
|
||||||
|
|
||||||
delete req;
|
delete req;
|
||||||
}
|
}
|
||||||
@ -4467,15 +4454,15 @@ Handle<Value> RandomBytes(const Arguments& args) {
|
|||||||
req->size_ = size;
|
req->size_ = size;
|
||||||
|
|
||||||
if (args[1]->IsFunction()) {
|
if (args[1]->IsFunction()) {
|
||||||
Local<Function> callback_v = Local<Function>(Function::Cast(*args[1]));
|
req->obj_ = Persistent<Object>::New(Object::New());
|
||||||
req->callback_ = Persistent<Function>::New(callback_v);
|
req->obj_->Set(String::New("ondone"), args[1]);
|
||||||
|
|
||||||
uv_queue_work(uv_default_loop(),
|
uv_queue_work(uv_default_loop(),
|
||||||
&req->work_req_,
|
&req->work_req_,
|
||||||
RandomBytesWork<generator>,
|
RandomBytesWork<generator>,
|
||||||
RandomBytesAfter<generator>);
|
RandomBytesAfter<generator>);
|
||||||
|
|
||||||
return Undefined();
|
return req->obj_;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Local<Value> argv[2];
|
Local<Value> argv[2];
|
||||||
|
@ -110,7 +110,7 @@ class Connection : ObjectWrap {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
|
#ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
|
||||||
v8::Persistent<v8::Function> sniCallback_;
|
v8::Persistent<v8::Object> sniObject_;
|
||||||
v8::Persistent<v8::Value> sniContext_;
|
v8::Persistent<v8::Value> sniContext_;
|
||||||
v8::Persistent<v8::String> servername_;
|
v8::Persistent<v8::String> servername_;
|
||||||
#endif
|
#endif
|
||||||
@ -185,7 +185,7 @@ class Connection : ObjectWrap {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
|
#ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
|
||||||
if (!sniCallback_.IsEmpty()) sniCallback_.Dispose();
|
if (!sniObject_.IsEmpty()) sniObject_.Dispose();
|
||||||
if (!sniContext_.IsEmpty()) sniContext_.Dispose();
|
if (!sniContext_.IsEmpty()) sniContext_.Dispose();
|
||||||
if (!servername_.IsEmpty()) servername_.Dispose();
|
if (!servername_.IsEmpty()) servername_.Dispose();
|
||||||
#endif
|
#endif
|
||||||
|
3
test/fixtures/child-process-message-and-exit.js
vendored
Normal file
3
test/fixtures/child-process-message-and-exit.js
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
process.send('hello');
|
||||||
|
process.exit(0);
|
106
test/pummel/test-https-ci-reneg-attack.js
Normal file
106
test/pummel/test-https-ci-reneg-attack.js
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
// Copyright Joyent, Inc. and other Node contributors.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
// copy of this software and associated documentation files (the
|
||||||
|
// "Software"), to deal in the Software without restriction, including
|
||||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||||
|
// persons to whom the Software is furnished to do so, subject to the
|
||||||
|
// following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included
|
||||||
|
// in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
var common = require('../common');
|
||||||
|
var assert = require('assert');
|
||||||
|
var spawn = require('child_process').spawn;
|
||||||
|
var tls = require('tls');
|
||||||
|
var https = require('https');
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
// renegotiation limits to test
|
||||||
|
var LIMITS = [0, 1, 2, 3, 5, 10, 16];
|
||||||
|
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
console.log('Skipping test, you probably don\'t have openssl installed.');
|
||||||
|
process.exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
var n = 0;
|
||||||
|
function next() {
|
||||||
|
if (n >= LIMITS.length) return;
|
||||||
|
tls.CLIENT_RENEG_LIMIT = LIMITS[n++];
|
||||||
|
test(next);
|
||||||
|
}
|
||||||
|
next();
|
||||||
|
})();
|
||||||
|
|
||||||
|
function test(next) {
|
||||||
|
var options = {
|
||||||
|
cert: fs.readFileSync(common.fixturesDir + '/test_cert.pem'),
|
||||||
|
key: fs.readFileSync(common.fixturesDir + '/test_key.pem')
|
||||||
|
};
|
||||||
|
|
||||||
|
var seenError = false;
|
||||||
|
|
||||||
|
var server = https.createServer(options, function(req, res) {
|
||||||
|
var conn = req.connection;
|
||||||
|
conn.on('error', function(err) {
|
||||||
|
console.error('Caught exception: ' + err);
|
||||||
|
assert(/TLS session renegotiation attack/.test(err));
|
||||||
|
conn.destroy();
|
||||||
|
seenError = true;
|
||||||
|
});
|
||||||
|
res.end('ok');
|
||||||
|
});
|
||||||
|
|
||||||
|
server.listen(common.PORT, function() {
|
||||||
|
var args = ('s_client -connect 127.0.0.1:' + common.PORT).split(' ');
|
||||||
|
var child = spawn('openssl', args);
|
||||||
|
|
||||||
|
child.stdout.pipe(process.stdout);
|
||||||
|
child.stderr.pipe(process.stderr);
|
||||||
|
|
||||||
|
// count handshakes, start the attack after the initial handshake is done
|
||||||
|
var handshakes = 0;
|
||||||
|
var renegs = 0;
|
||||||
|
|
||||||
|
child.stderr.on('data', function(data) {
|
||||||
|
if (seenError) return;
|
||||||
|
handshakes += (('' + data).match(/verify return:1/g) || []).length;
|
||||||
|
if (handshakes === 2) spam();
|
||||||
|
renegs += (('' + data).match(/RENEGOTIATING/g) || []).length;
|
||||||
|
});
|
||||||
|
|
||||||
|
child.on('exit', function() {
|
||||||
|
assert.equal(renegs, tls.CLIENT_RENEG_LIMIT + 1);
|
||||||
|
server.close();
|
||||||
|
process.nextTick(next);
|
||||||
|
});
|
||||||
|
|
||||||
|
var closed = false;
|
||||||
|
child.stdin.on('error', function(err) {
|
||||||
|
assert.equal(err.code, 'EPIPE');
|
||||||
|
closed = true;
|
||||||
|
});
|
||||||
|
child.stdin.on('close', function() {
|
||||||
|
closed = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
// simulate renegotiation attack
|
||||||
|
function spam() {
|
||||||
|
if (closed) return;
|
||||||
|
child.stdin.write('R\n');
|
||||||
|
setTimeout(spam, 50);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
57
test/simple/test-child-process-fork-close.js
Normal file
57
test/simple/test-child-process-fork-close.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
// Copyright Joyent, Inc. and other Node contributors.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
// copy of this software and associated documentation files (the
|
||||||
|
// "Software"), to deal in the Software without restriction, including
|
||||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||||
|
// persons to whom the Software is furnished to do so, subject to the
|
||||||
|
// following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included
|
||||||
|
// in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
var assert = require('assert'),
|
||||||
|
common = require('../common'),
|
||||||
|
fork = require('child_process').fork,
|
||||||
|
fork = require('child_process').fork;
|
||||||
|
|
||||||
|
var cp = fork(common.fixturesDir + '/child-process-message-and-exit.js');
|
||||||
|
|
||||||
|
var gotMessage = false,
|
||||||
|
gotExit = false,
|
||||||
|
gotClose = false;
|
||||||
|
|
||||||
|
cp.on('message', function(message) {
|
||||||
|
assert(!gotMessage);
|
||||||
|
assert(!gotClose);
|
||||||
|
assert.strictEqual(message, 'hello');
|
||||||
|
gotMessage = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
cp.on('exit', function() {
|
||||||
|
assert(!gotExit);
|
||||||
|
assert(!gotClose);
|
||||||
|
gotExit = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
cp.on('close', function() {
|
||||||
|
assert(gotMessage);
|
||||||
|
assert(gotExit);
|
||||||
|
assert(!gotClose);
|
||||||
|
gotClose = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on('exit', function() {
|
||||||
|
assert(gotMessage);
|
||||||
|
assert(gotExit);
|
||||||
|
assert(gotClose);
|
||||||
|
});
|
37
test/simple/test-domain-crypto.js
Normal file
37
test/simple/test-domain-crypto.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// Copyright Joyent, Inc. and other Node contributors.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
// copy of this software and associated documentation files (the
|
||||||
|
// "Software"), to deal in the Software without restriction, including
|
||||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||||
|
// persons to whom the Software is furnished to do so, subject to the
|
||||||
|
// following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included
|
||||||
|
// in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
try {
|
||||||
|
var crypto = require('crypto');
|
||||||
|
} catch (e) {
|
||||||
|
console.log('Not compiled with OPENSSL support.');
|
||||||
|
process.exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// the missing var keyword is intentional
|
||||||
|
domain = require('domain');
|
||||||
|
|
||||||
|
// should not throw a 'TypeError: undefined is not a function' exception
|
||||||
|
crypto.randomBytes(8);
|
||||||
|
crypto.randomBytes(8, function() {});
|
||||||
|
crypto.pseudoRandomBytes(8);
|
||||||
|
crypto.pseudoRandomBytes(8, function() {});
|
||||||
|
crypto.pbkdf2('password', 'salt', 8, 8, function() {});
|
49
test/simple/test-tls-connect-pipe.js
Normal file
49
test/simple/test-tls-connect-pipe.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
// Copyright Joyent, Inc. and other Node contributors.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
// copy of this software and associated documentation files (the
|
||||||
|
// "Software"), to deal in the Software without restriction, including
|
||||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||||
|
// persons to whom the Software is furnished to do so, subject to the
|
||||||
|
// following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included
|
||||||
|
// in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
var common = require('../common');
|
||||||
|
var assert = require('assert');
|
||||||
|
var tls = require('tls');
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
var clientConnected = 0;
|
||||||
|
var serverConnected = 0;
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
key: fs.readFileSync(common.fixturesDir + '/keys/agent1-key.pem'),
|
||||||
|
cert: fs.readFileSync(common.fixturesDir + '/keys/agent1-cert.pem')
|
||||||
|
};
|
||||||
|
|
||||||
|
var server = tls.Server(options, function(socket) {
|
||||||
|
++serverConnected;
|
||||||
|
server.close();
|
||||||
|
});
|
||||||
|
server.listen(common.PIPE, function() {
|
||||||
|
var client = tls.connect(common.PIPE, function() {
|
||||||
|
++clientConnected;
|
||||||
|
client.end();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on('exit', function() {
|
||||||
|
assert.equal(clientConnected, 1);
|
||||||
|
assert.equal(serverConnected, 1);
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user