@@ -105,6 +105,7 @@ const {
105105 ERR_INVALID_FD_TYPE ,
106106 ERR_INVALID_HANDLE_TYPE ,
107107 ERR_INVALID_IP_ADDRESS ,
108+ ERR_IP_BLOCKED ,
108109 ERR_MISSING_ARGS ,
109110 ERR_SERVER_ALREADY_LISTEN ,
110111 ERR_SERVER_NOT_RUNNING ,
@@ -510,6 +511,12 @@ function Socket(options) {
510511 // Used after `.destroy()`
511512 this [ kBytesRead ] = 0 ;
512513 this [ kBytesWritten ] = 0 ;
514+ if ( options . blockList ) {
515+ if ( ! module . exports . BlockList . isBlockList ( options . blockList ) ) {
516+ throw new ERR_INVALID_ARG_TYPE ( 'options.blockList' , 'net.BlockList' , options . blockList ) ;
517+ }
518+ this . blockList = options . blockList ;
519+ }
513520}
514521ObjectSetPrototypeOf ( Socket . prototype , stream . Duplex . prototype ) ;
515522ObjectSetPrototypeOf ( Socket , stream . Duplex ) ;
@@ -1073,6 +1080,10 @@ function internalConnect(
10731080 self . emit ( 'connectionAttempt' , address , port , addressType ) ;
10741081
10751082 if ( addressType === 6 || addressType === 4 ) {
1083+ if ( self . blockList ?. check ( address , `ipv${ addressType } ` ) ) {
1084+ self . destroy ( new ERR_IP_BLOCKED ( address ) ) ;
1085+ return ;
1086+ }
10761087 const req = new TCPConnectWrap ( ) ;
10771088 req . oncomplete = afterConnect ;
10781089 req . address = address ;
@@ -1162,6 +1173,14 @@ function internalConnectMultiple(context, canceled) {
11621173 }
11631174 }
11641175
1176+ if ( self . blockList ?. check ( address , `ipv${ addressType } ` ) ) {
1177+ const ex = new ERR_IP_BLOCKED ( address ) ;
1178+ ArrayPrototypePush ( context . errors , ex ) ;
1179+ self . emit ( 'connectionAttemptFailed' , address , port , addressType , ex ) ;
1180+ internalConnectMultiple ( context ) ;
1181+ return ;
1182+ }
1183+
11651184 debug ( 'connect/multiple: attempting to connect to %s:%d (addressType: %d)' , address , port , addressType ) ;
11661185 self . emit ( 'connectionAttempt' , address , port , addressType ) ;
11671186
@@ -1792,8 +1811,7 @@ function Server(options, connectionListener) {
17921811 this . keepAliveInitialDelay = ~ ~ ( options . keepAliveInitialDelay / 1000 ) ;
17931812 this . highWaterMark = options . highWaterMark ?? getDefaultHighWaterMark ( ) ;
17941813 if ( options . blockList ) {
1795- // TODO: use BlockList.isBlockList (https://github.com/nodejs/node/pull/56078)
1796- if ( ! ( options . blockList instanceof module . exports . BlockList ) ) {
1814+ if ( ! module . exports . BlockList . isBlockList ( options . blockList ) ) {
17971815 throw new ERR_INVALID_ARG_TYPE ( 'options.blockList' , 'net.BlockList' , options . blockList ) ;
17981816 }
17991817 this . blockList = options . blockList ;
0 commit comments