Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AssertionError: args[1]->IsString() when custom DNS lookup callback returns array instead of string #57112

Open
01101sam opened this issue Feb 17, 2025 · 2 comments

Comments

@01101sam
Copy link

Version

v23.4.0

Platform

Darwin MacBook-Pro.local 24.3.0 Darwin Kernel Version 24.3.0: Thu Jan  2 20:24:23 PST 2025; root:xnu-11215.81.4~3/RELEASE_ARM64_T6031 arm64

Subsystem

No response

What steps will reproduce the bug?

  1. Create a custom DNS lookup function that, instead of returning a string IP address, calls its callback with an array. For example:
const customLookup = (hostname, options, callback) => {
  // Incorrectly return an array of IPs instead of a string.
  callback(null, ["127.0.0.1"], options.family);
};
  1. Use this custom lookup in a network connection, for example:
import net from 'node:net';

const options = {
  host: 'example.com',
  port: 80,
  lookup: customLookup,
  family: 4  // <- Trigger point, 4 or 6 can trigger the same
};

const socket = net.connect(options, () => {
  console.log("Connected!");
});

socket.on('error', (err) => {
  console.error("Socket error:", err);
});
  1. Run the script using Node.js v23.4.0 on macOS.

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

It reproduces 100% of the time when using a custom DNS lookup that returns an array instead of a string as the address.

This requires running on Node.js v23.4.0 (and likely later versions) on Darwin. Not tested on other version, but likely can reproduce the same result.

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

The DNS lookup callback should either return a valid string IP address or pass an error to the callback.

In other words, if the lookup returns an invalid type (like an array), Node.js should handle it gracefully—by invoking the callback with an error—rather than crashing.

This behavior is expected to ensure that user code can handle lookup errors consistently without encountering an internal assertion failure.

What do you see instead?

Instead of passing an error to the callback, Node.js crashes with an assertion error:

Crash Log

  #  /Users/sam/.nvm/versions/node/v23.4.0/bin/node[23482]: static void node::TCPWrap::Connect(const FunctionCallbackInfo<v8::Value> &, std::function<int (const char *, T *)>) [T = sockaddr_in] at ../src/tcp_wrap.cc:325
  #  Assertion failed: args[1]->IsString()

----- Native stack trace -----

 1: 0x10478c91c node::Assert(node::AssertionInfo const&) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
 2: 0x1065bf0d8 void node::TCPWrap::Connect<sockaddr_in>(v8::FunctionCallbackInfo<v8::Value> const&, std::__1::function<int (char const*, sockaddr_in*)>) (.cold.3) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
 3: 0x1048a5950 void node::TCPWrap::Connect<sockaddr_in>(v8::FunctionCallbackInfo<v8::Value> const&, std::__1::function<int (char const*, sockaddr_in*)>) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
 4: 0x1048a40d4 node::TCPWrap::Connect(v8::FunctionCallbackInfo<v8::Value> const&) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
 5: 0x10553e978 Builtins_CallApiCallbackGeneric [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
 6: 0x10553c838 Builtins_InterpreterEntryTrampoline [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
 7: 0x10553c838 Builtins_InterpreterEntryTrampoline [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
 8: 0x10553c838 Builtins_InterpreterEntryTrampoline [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
 9: 0x10553c838 Builtins_InterpreterEntryTrampoline [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
10: 0x10553c838 Builtins_InterpreterEntryTrampoline [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
11: 0x10553c838 Builtins_InterpreterEntryTrampoline [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
12: 0x10553c838 Builtins_InterpreterEntryTrampoline [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
13: 0x10553c838 Builtins_InterpreterEntryTrampoline [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
14: 0x10553c838 Builtins_InterpreterEntryTrampoline [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
15: 0x10553c838 Builtins_InterpreterEntryTrampoline [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
16: 0x10557c2c4 Builtins_GeneratorPrototypeNext [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
17: 0x10553a50c Builtins_JSEntryTrampoline [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
18: 0x10553a1b0 Builtins_JSEntry [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
19: 0x104b13564 v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
20: 0x104b13dc0 v8::internal::(anonymous namespace)::InvokeWithTryCatch(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
21: 0x104b13e8c v8::internal::Execution::TryCall(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*, v8::internal::Execution::MessageHandling, v8::internal::MaybeHandle<v8::internal::Object>*) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
22: 0x104eb3338 v8::internal::SourceTextModule::ExecuteModule(v8::internal::Isolate*, v8::internal::Handle<v8::internal::SourceTextModule>, v8::internal::MaybeHandle<v8::internal::Object>*) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
23: 0x104eb2c60 v8::internal::SourceTextModule::InnerModuleEvaluation(v8::internal::Isolate*, v8::internal::Handle<v8::internal::SourceTextModule>, v8::internal::ZoneForwardList<v8::internal::Handle<v8::internal::SourceTextModule>>*, unsigned int*) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
24: 0x104eb2790 v8::internal::SourceTextModule::Evaluate(v8::internal::Isolate*, v8::internal::Handle<v8::internal::SourceTextModule>) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
25: 0x104e6e814 v8::internal::Module::Evaluate(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Module>) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
26: 0x1049bf5ac v8::Module::Evaluate(v8::Local<v8::Context>) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
27: 0x104741d84 node::loader::ModuleWrap::Evaluate(v8::FunctionCallbackInfo<v8::Value> const&) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
28: 0x10553e978 Builtins_CallApiCallbackGeneric [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
29: 0x10553c838 Builtins_InterpreterEntryTrampoline [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
30: 0x105579e20 Builtins_AsyncFunctionAwaitResolveClosure [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
31: 0x105647298 Builtins_PromiseFulfillReactionJob [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
32: 0x105569214 Builtins_RunMicrotasks [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
33: 0x10553a3f0 Builtins_JSRunMicrotasksEntry [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
34: 0x104b13524 v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
35: 0x104b13dc0 v8::internal::(anonymous namespace)::InvokeWithTryCatch(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
36: 0x104b13ef8 v8::internal::Execution::TryRunMicrotasks(v8::internal::Isolate*, v8::internal::MicrotaskQueue*) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
37: 0x104b3fdf0 v8::internal::MicrotaskQueue::RunMicrotasks(v8::internal::Isolate*) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
38: 0x104b406a8 v8::internal::MicrotaskQueue::PerformCheckpoint(v8::Isolate*) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
39: 0x1046a9994 node::InternalCallbackScope::Close() [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
40: 0x1046a9454 node::InternalCallbackScope::~InternalCallbackScope() [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
41: 0x1047915cc node::fs::FileHandle::CloseReq::Resolve() [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
42: 0x1047ae358 node::fs::FileHandle::ClosePromise()::$_0::__invoke(uv_fs_s*) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
43: 0x104785300 node::MakeLibuvRequestCallback<uv_fs_s, void (*)(uv_fs_s*)>::Wrapper(uv_fs_s*) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
44: 0x105515a80 uv__work_done [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
45: 0x10551978c uv__async_io [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
46: 0x10552d368 uv__io_poll [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
47: 0x105519d24 uv_run [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
48: 0x1046aa4e4 node::SpinEventLoopInternal(node::Environment*) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
49: 0x1047d4cf8 node::NodeMainInstance::Run(node::ExitCode*, node::Environment*) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
50: 0x1047d4a94 node::NodeMainInstance::Run() [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
51: 0x10474a8fc node::Start(int, char**) [/Users/sam/.nvm/versions/node/v23.4.0/bin/node]
52: 0x19758c274 start [/usr/lib/dyld]

----- JavaScript stack trace -----

1: internalConnect (node:net:1096:26)
2: defaultTriggerAsyncIdScope (node:internal/async_hooks:464:18)
3: emitLookup (node:net:1429:9)
4: customLookup (file:///Users/sam/Jetbrains_Projects/WebStorm/playground/dns-lookup-err.mjs:8:12)
5: node:net:1406:5
6: defaultTriggerAsyncIdScope (node:internal/async_hooks:464:18)
7: lookupAndConnect (node:net:1405:3)
8: Socket.connect (node:net:1284:5)
9: connect (node:net:250:17)
10: file:///Users/sam/Jetbrains_Projects/WebStorm/playground/dns-lookup-err.mjs:21:20



Process finished with exit code 134 (interrupted by signal 6:SIGABRT)

Additional information

No response

@aduh95
Copy link
Contributor

aduh95 commented Feb 20, 2025

Would you like to send a PR?

@01101sam
Copy link
Author

Would you like to send a PR?

Thanks for your invitation, but I currently don't have much time to deeply inverstgate the problem and fix it since I have 4 project running concurrently.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants