Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tls throws when working with JSStreams #12716

Closed
coolaj86 opened this issue Apr 28, 2017 · 3 comments
Closed

tls throws when working with JSStreams #12716

coolaj86 opened this issue Apr 28, 2017 · 3 comments
Labels
tls Issues and PRs related to the tls subsystem.

Comments

@coolaj86
Copy link
Contributor

coolaj86 commented Apr 28, 2017

Version: v7.7.4
Platform: Darwin
Subsystem: tls

Here's the lovely error:

Assertion failed: (uv__stream_fd(stream) >= 0), function uv_read_start, file ../deps/uv/src/unix/stream.c, line 1545.

And here's how you can too:

'use strict';

var net = require('net');
var tls = require('tls');
// just a simple wrapper around a duplex to create both halves of a socket - very very simple
// https://github.com/indutny/stream-pair/blob/master/lib/stream-pair.js
var streamPair = require('stream-pair');

var netServer = net.createServer(handleTcp);

// just some certs so that it's easy to test all this
var tlsOptions = require('localhost.daplie.me-certificates').merge({});
var tlsServer = tls.createServer(tlsOptions, handleTls);

function handleTcp(conn) {
  tlsServer.emit('connection', conn);
}

function handleTls(conn) {
  conn.on('data', function (chunk) {
    console.log(chunk.toString('utf8'));
  });
}

var writer = streamPair.create();
var reader = writer.other;

netServer.emit('connection', reader);

// generated in this way
// nc -l 3000 > /tmp/sni.bin
// https://localhost.daplie.me:3000/
// hexdump -ve '1/1 "%.2x"' /tmp/sni.bin
var sni = '16030100ce010000ca03032d4ad3b5daf224a8465309487ed334c91de34c05ca5bf1c042ef54c510aadea80000202a2ac02bc02fc02cc030cca9cca8cc14cc13c013c014009c009d002f0035000a01000081dada0000ff010001000000001800160000136c6f63616c686f73742e6461706c69652e6d650017000000230000000d00140012040308040401050308050501080606010201000500050100000000001200000010000e000c02683208687474702f312e3175500000000b00020100000a000a00084a4a001d00170018baba000100';
writer.write(Buffer.from(sni, 'hex'));

and since all of my issues go to you anyway, might as well:

cc/ @indutny

May be related to:

@mscdex mscdex added the tls Issues and PRs related to the tls subsystem. label Apr 28, 2017
@coolaj86
Copy link
Contributor Author

coolaj86 commented Apr 28, 2017

Workaround

Create a unix socket or windows pipe just for the sake of getting that fd so that the tls module can do its binary magic:

https://git.daplie.com/Daplie/socket-pair

'use strict';

var net = require('net');
var tls = require('tls');
// just a simple wrapper around a server and socket to create both of the necessary halves
// https://git.daplie.com/Daplie/socket-pair/blob/master/lib/socket-pair.js

var netServer = net.createServer(handleTcp);

// just some certs so that it's easy to test all this
var tlsOptions = require('localhost.daplie.me-certificates').merge({});
var tlsServer = tls.createServer(tlsOptions, handleTls);

function handleTcp(conn) {
  tlsServer.emit('connection', conn);
}

function handleTls(conn) {
  conn.on('data', function (chunk) {
    console.log(chunk.toString('utf8'));
  });
}

var writer = require('socket-pair').create(function (err, reader) {
  netServer.emit('connection', reader);

  // generated in this way
  // nc -l 3000 > /tmp/sni.bin
  // https://localhost.daplie.me:3000/
  // hexdump -ve '1/1 "%.2x"' /tmp/sni.bin
  var sni = '16030100ce010000ca03032d4ad3b5daf224a8465309487ed334c91de34c05ca5bf1c042ef54c510aadea80000202a2ac02bc02fc02cc030cca9cca8cc14cc13c013c014009c009d002f0035000a01000081dada0000ff010001000000001800160000136c6f63616c686f73742e6461706c69652e6d650017000000230000000d00140012040308040401050308050501080606010201000500050100000000001200000010000e000c02683208687474702f312e3175500000000b00020100000a000a00084a4a001d00170018baba000100';
  writer.write(Buffer.from(sni, 'hex'));

  // this "hangs", but it if you attach a `data` event you can see that
  // the "reader" was written back to with the handshake response
});

@addaleax
Copy link
Member

I think this has been fixed in b23d414 – can you confirm that?

@coolaj86
Copy link
Contributor Author

Using the example code that I provided above my findings are:

FAILURE in node v6.11.1 LTS

SUCCESS in node v8.2.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
tls Issues and PRs related to the tls subsystem.
Projects
None yet
Development

No branches or pull requests

3 participants