'use strict'; const common = require('../common'); const assert = require('node:assert'); const { execFileSync } = require('node:child_process'); if (!common.isLinux) { common.skip('test is Linux specific'); } if (process.arch !== 'x64' && process.arch !== 'arm64') { common.skip('io_uring support on this architecture is uncertain'); } const kv = /^(\d+)\.(\d+)\.(\d+)/.exec(execFileSync('uname', ['-r'])).slice(1).map((n) => parseInt(n, 10)); if (((kv[0] << 16) | (kv[1] << 8) | kv[2]) < 0x050ABA) { common.skip('io_uring is likely buggy due to old kernel'); } const userIdentitySetters = [ ['setuid', [1000]], ['seteuid', [1000]], ['setgid', [1000]], ['setegid', [1000]], ['setgroups', [[1000]]], ['initgroups', ['nodeuser', 1000]], ]; for (const [fnName, args] of userIdentitySetters) { const call = `process.${fnName}(${args.map((a) => JSON.stringify(a)).join(', ')})`; const code = `try { ${call}; } catch (err) { console.log(err); }`; const stdout = execFileSync(process.execPath, ['-e', code], { encoding: 'utf8', env: { ...process.env, UV_USE_IO_URING: '1' }, }); const msg = new RegExp(`^Error: ${fnName}\\(\\) disabled: io_uring may be enabled\\. See CVE-[X0-9]{4}-`); assert.match(stdout, msg); assert.match(stdout, /code: 'ERR_INVALID_STATE'/); console.log(call, stdout.slice(0, stdout.indexOf('\n'))); }