@@ -871,6 +871,27 @@ function afterWrite(status, handle, req, err) {
871
871
}
872
872
873
873
874
+ function checkBindError ( err , port , handle ) {
875
+ // EADDRINUSE may not be reported until we call listen() or connect().
876
+ // To complicate matters, a failed bind() followed by listen() or connect()
877
+ // will implicitly bind to a random port. Ergo, check that the socket is
878
+ // bound to the expected port before calling listen() or connect().
879
+ //
880
+ // FIXME(bnoordhuis) Doesn't work for pipe handles, they don't have a
881
+ // getsockname() method. Non-issue for now, the cluster module doesn't
882
+ // really support pipes anyway.
883
+ if ( err === 0 && port > 0 && handle . getsockname ) {
884
+ var out = { } ;
885
+ err = handle . getsockname ( out ) ;
886
+ if ( err === 0 && port !== out . port ) {
887
+ debug ( `checkBindError, bound to ${ out . port } instead of ${ port } ` ) ;
888
+ err = uv . UV_EADDRINUSE ;
889
+ }
890
+ }
891
+ return err ;
892
+ }
893
+
894
+
874
895
function internalConnect (
875
896
self , address , port , addressType , localAddress , localPort ) {
876
897
// TODO return promise from Socket.prototype.connect which
@@ -894,6 +915,7 @@ function internalConnect(
894
915
debug ( 'binding to localAddress: %s and localPort: %d (addressType: %d)' ,
895
916
localAddress , localPort , addressType ) ;
896
917
918
+ err = checkBindError ( err , localPort , self . _handle ) ;
897
919
if ( err ) {
898
920
const ex = exceptionWithHostPort ( err , 'bind' , localAddress , localPort ) ;
899
921
self . destroy ( ex ) ;
@@ -1382,20 +1404,7 @@ function listenInCluster(server, address, port, addressType,
1382
1404
cluster . _getServer ( server , serverQuery , listenOnMasterHandle ) ;
1383
1405
1384
1406
function listenOnMasterHandle ( err , handle ) {
1385
- // EADDRINUSE may not be reported until we call listen(). To complicate
1386
- // matters, a failed bind() followed by listen() will implicitly bind to
1387
- // a random port. Ergo, check that the socket is bound to the expected
1388
- // port before calling listen().
1389
- //
1390
- // FIXME(bnoordhuis) Doesn't work for pipe handles, they don't have a
1391
- // getsockname() method. Non-issue for now, the cluster module doesn't
1392
- // really support pipes anyway.
1393
- if ( err === 0 && port > 0 && handle . getsockname ) {
1394
- var out = { } ;
1395
- err = handle . getsockname ( out ) ;
1396
- if ( err === 0 && port !== out . port )
1397
- err = uv . UV_EADDRINUSE ;
1398
- }
1407
+ err = checkBindError ( err , port , handle ) ;
1399
1408
1400
1409
if ( err ) {
1401
1410
var ex = exceptionWithHostPort ( err , 'bind' , address , port ) ;
0 commit comments