55 ArrayPrototypeForEach,
66 ArrayPrototypeMap,
77 ArrayPrototypePush,
8+ ArrayPrototypeSlice,
89 AtomicsAdd,
910 Float64Array,
1011 FunctionPrototypeBind,
@@ -20,6 +21,7 @@ const {
2021 SafeMap,
2122 String,
2223 StringPrototypeTrim,
24+ StringPrototypeStartsWith,
2325 Symbol,
2426 SymbolAsyncDispose,
2527 SymbolFor,
@@ -111,6 +113,8 @@ let debug = require('internal/util/debuglog').debuglog('worker', (fn) => {
111113const dc = require ( 'diagnostics_channel' ) ;
112114const workerThreadsChannel = dc . channel ( 'worker_threads' ) ;
113115
116+ const permission = require ( 'internal/process/permission' ) ;
117+
114118let cwdCounter ;
115119let normalizeHeapProfileOptions ;
116120let normalizeCpuProfileOptions ;
@@ -204,6 +208,52 @@ class HeapProfileHandle {
204208 }
205209}
206210
211+
212+ function ensurePermissionFlagsInExecArgv ( execArgv ) {
213+ if ( ! permission . isEnabled ( ) || execArgv == null ) {
214+ return execArgv ;
215+ }
216+ const flagsToCopy = [
217+ ...permission . availableFlags ( ) ,
218+ '--permission' ,
219+ '--permission-audit' ,
220+ ] ;
221+ const out = ArrayPrototypeSlice ( execArgv ) ;
222+ const hasToken = ( token ) => {
223+ for ( let i = 0 ; i < out . length ; i ++ ) {
224+ const a = out [ i ] ;
225+ if ( a === token ) return true ;
226+ if ( typeof a === 'string' && a . startsWith ( `${ token } =` ) ) return true ;
227+ }
228+ return false ;
229+ } ;
230+ for ( let i = 0 ; i < process . execArgv . length ; i ++ ) {
231+ const arg = process . execArgv [ i ] ;
232+ for ( let j = 0 ; j < flagsToCopy . length ; j ++ ) {
233+ const flag = flagsToCopy [ j ] ;
234+ if ( arg === flag ) {
235+ if ( ! hasToken ( flag ) ) {
236+ ArrayPrototypePush ( out , arg ) ;
237+ const next = process . execArgv [ i + 1 ] ;
238+ if ( next && ! StringPrototypeStartsWith ( next , '-' ) ) {
239+ ArrayPrototypePush ( out , next ) ;
240+ }
241+ }
242+ } else if ( StringPrototypeStartsWith ( arg , `${ flag } =` ) ) {
243+ let present = false ;
244+ for ( let k = 0 ; k < out . length ; k ++ ) {
245+ if ( out [ k ] === arg || StringPrototypeStartsWith ( out [ k ] , `${ flag } =` ) ) {
246+ present = true ;
247+ break ;
248+ }
249+ }
250+ if ( ! present ) ArrayPrototypePush ( out , arg ) ;
251+ }
252+ }
253+ }
254+ return out ;
255+ }
256+
207257class Worker extends EventEmitter {
208258 constructor ( filename , options = kEmptyObject ) {
209259 throwIfBuildingSnapshot ( 'Creating workers' ) ;
@@ -218,6 +268,10 @@ class Worker extends EventEmitter {
218268 if ( options . execArgv )
219269 validateArray ( options . execArgv , 'options.execArgv' ) ;
220270
271+ let workerExecArgv = options . execArgv ;
272+ if ( workerExecArgv )
273+ workerExecArgv = ensurePermissionFlagsInExecArgv ( workerExecArgv ) ;
274+
221275 let argv ;
222276 if ( options . argv ) {
223277 validateArray ( options . argv , 'options.argv' ) ;
@@ -288,7 +342,7 @@ class Worker extends EventEmitter {
288342 // Set up the C++ handle for the worker, as well as some internal wiring.
289343 this [ kHandle ] = new WorkerImpl ( url ,
290344 env === process . env ? null : env ,
291- options . execArgv ,
345+ workerExecArgv ,
292346 parseResourceLimits ( options . resourceLimits ) ,
293347 ! ! ( options . trackUnmanagedFds ?? true ) ,
294348 isInternal ,
0 commit comments