node icon indicating copy to clipboard operation
node copied to clipboard

childprocess kill() results in -4048 EPERM error on windows since update to v21.6.2

Open Uzlopak opened this issue 3 months ago • 1 comments

Version

v21.6.2

Platform

Microsoft Windows NT 10.0.22621.0 x64

Subsystem

child_process

What steps will reproduce the bug?

Suddenly in latest undici the tests in test/node-test/debug.js fail if run under windows with node v21.6.2.

It fails under PowerShell and cmd.

It seems that there is suddenly a permission issue when trying to kill a child_process. With node v21.6.1 .kill() doesnt throw.

How often does it reproduce? Is there a required condition?

Always reproducable

What is the expected behavior? Why is that the expected behavior?

Should not throw (and close the child process)

What do you see instead?

PS C:\Users\Aras\Desktop\undici> node .\test\node-test\debug.js
✖ debug#websocket (175.6675ms)
  Error: kill EPERM
      at ChildProcess.kill (node:internal/child_process:512:26)
      at TestContext.<anonymous> (C:\Users\Aras\Desktop\undici\test\node-test\debug.js:48:9)
      at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
      at async Test.run (node:internal/test_runner/test:632:9)
      at async startSubtest (node:internal/test_runner/harness:218:3) {
    errno: -4048,
    code: 'EPERM',
    syscall: 'kill'
  }

✖ debug#fetch (174.8844ms)
  Error: kill EPERM
      at ChildProcess.kill (node:internal/child_process:512:26)
      at TestContext.<anonymous> (C:\Users\Aras\Desktop\undici\test\node-test\debug.js:83:9)
      at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
      at async Test.run (node:internal/test_runner/test:632:9)
      at async Test.processPendingSubtests (node:internal/test_runner/test:374:7) {
    errno: -4048,
    code: 'EPERM',
    syscall: 'kill'
  }

✖ debug#undici (150.1489ms)
  Error: kill EPERM
      at ChildProcess.kill (node:internal/child_process:512:26)
      at TestContext.<anonymous> (C:\Users\Aras\Desktop\undici\test\node-test\debug.js:121:9)
      at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
      at async Test.run (node:internal/test_runner/test:632:9)
      at async Test.processPendingSubtests (node:internal/test_runner/test:374:7) {
    errno: -4048,
    code: 'EPERM',
    syscall: 'kill'
  }

ℹ tests 3
ℹ suites 0
ℹ pass 0
ℹ fail 3
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 511.956

✖ failing tests:

test at test\node-test\debug.js:11:1
✖ debug#websocket (175.6675ms)
  Error: kill EPERM
      at ChildProcess.kill (node:internal/child_process:512:26)
      at TestContext.<anonymous> (C:\Users\Aras\Desktop\undici\test\node-test\debug.js:48:9)
      at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
      at async Test.run (node:internal/test_runner/test:632:9)
      at async startSubtest (node:internal/test_runner/harness:218:3) {
    errno: -4048,
    code: 'EPERM',
    syscall: 'kill'
  }

test at test\node-test\debug.js:51:1
✖ debug#fetch (174.8844ms)
  Error: kill EPERM
      at ChildProcess.kill (node:internal/child_process:512:26)
      at TestContext.<anonymous> (C:\Users\Aras\Desktop\undici\test\node-test\debug.js:83:9)
      at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
      at async Test.run (node:internal/test_runner/test:632:9)
      at async Test.processPendingSubtests (node:internal/test_runner/test:374:7) {
    errno: -4048,
    code: 'EPERM',
    syscall: 'kill'
  }

test at test\node-test\debug.js:86:1
✖ debug#undici (150.1489ms)
  Error: kill EPERM
      at ChildProcess.kill (node:internal/child_process:512:26)
      at TestContext.<anonymous> (C:\Users\Aras\Desktop\undici\test\node-test\debug.js:121:9)
      at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
      at async Test.run (node:internal/test_runner/test:632:9)
      at async Test.processPendingSubtests (node:internal/test_runner/test:374:7) {
    errno: -4048,
    code: 'EPERM',
    syscall: 'kill'
  }

Additional information

I assume that this bug is coming from libuv.

Uzlopak avatar Feb 15 '24 09:02 Uzlopak

@nodejs/libuv

targos avatar Feb 15 '24 09:02 targos

@targos

Should I open another issue in libuv?

Uzlopak avatar Feb 19 '24 23:02 Uzlopak

Maybe? I don't know if that would be relevant without a repro using libuv directly.

FWIW this commit changed the implementation of the uv_kill function on Windows: https://github.com/libuv/libuv/commit/129362f35648a61ab19ab665014d2013731a986b

@vtjnash

targos avatar Feb 20 '24 07:02 targos

@santigimeno could you take a look?

mcollina avatar Mar 04 '24 10:03 mcollina

So, I think there's a regression in libuv which might be solved in https://github.com/libuv/libuv/pull/4341. Regardless, just curious why the need to call child.kill() in those tests as the child processes should exit gracefully.

santigimeno avatar Mar 05 '24 14:03 santigimeno

@santigimeno

It spins up the server and then kills it. Was this way for quiete a while. i could have patched it, but then I could not have report this bug ;)

Uzlopak avatar Mar 05 '24 16:03 Uzlopak

This is fixed in libuv, so it'll be fixed once a new version reaches node.

santigimeno avatar Mar 05 '24 20:03 santigimeno

great job, thanks

Uzlopak avatar Mar 05 '24 20:03 Uzlopak

Is it correct that the update in libuv did not land in Node 22 either? Is there any timeline for this?

SimenB avatar Apr 26 '24 12:04 SimenB

I dont know. I just know that we patched our test in undici accordingly to not run into the issue again. So probably the bug exists still. Would need to check on a windows machine.

Uzlopak avatar Apr 26 '24 13:04 Uzlopak