{"record":{"id":"1220d0eb0eb27ae6","repo":"denoland/deno","slug":"invalid-path","errorCode":null,"errorMessage":"invalid path","messagePattern":"invalid path","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"libs/core/uv_compat/pipe.rs","lineNumber":782,"sourceCode":"      .internal_fd\n      .take()\n      .map(|fd| std::os::unix::net::UnixStream::from_raw_fd(fd))\n  };\n  let raw_fd = bound_stream.as_ref().map(|stream| {\n    use std::os::unix::io::AsRawFd;\n    stream.as_raw_fd()\n  });\n  let future = Box::pin(async move {\n    if let Some(stream) = bound_stream {\n      use std::os::unix::io::AsRawFd;\n\n      let fd = stream.as_raw_fd();\n      // Non-blocking connect on the pre-bound socket.\n      // SAFETY: fd is a valid socket from uv_pipe_bind.\n      unsafe {\n        let (addr, addr_len) =\n          make_sockaddr_un(path.as_str()).map_err(|_| {\n            std::io::Error::new(\n              std::io::ErrorKind::InvalidInput,\n              \"invalid path\",\n            )\n          })?;\n\n        // Set non-blocking before connect.\n        let flags = libc::fcntl(fd, libc::F_GETFL);\n        if flags != -1 {\n          libc::fcntl(fd, libc::F_SETFL, flags | libc::O_NONBLOCK);\n        }\n\n        let ret = libc::connect(\n          fd,\n          &addr as *const _ as *const libc::sockaddr,\n          addr_len as libc::socklen_t,\n        );\n        if ret != 0 {\n          let err = std::io::Error::last_os_error();","sourceCodeStart":764,"sourceCodeEnd":800,"githubUrl":"https://github.com/denoland/deno/blob/98f9507affc905f088124891add3a8dd63b91f77/libs/core/uv_compat/pipe.rs#L764-L800","documentation":"Deno's libuv-compat layer for node pipes (libs/core/uv_compat) connecting a Unix domain socket using a pre-bound fd: the path string is converted to a sockaddr_un by make_sockaddr_un, which rejects empty paths and paths longer than the OS sun_path limit (108 bytes on Linux, 104 on macOS, NUL included) with UV_EINVAL; the connect maps that to ErrorKind::InvalidInput 'invalid path'.","triggerScenarios":"Connecting a pipe/unix socket through the node-compat layer with an empty path string, or a filesystem path whose length reaches the sun_path limit — deeply nested project dirs, long TMPDIR prefixes (macOS /var/folders/...), or hashed cache paths baked by npm tooling.","commonSituations":"Unix-socket-based dev tools (IDE language servers, daemon sockets, test runners) run from deeply nested or temp locations; macOS default TMPDIR plus long generated names exceeding 103 usable bytes; embedded/anonymous socket misuse with empty strings.","solutions":["Shorten the socket path: place it directly in /tmp or a short per-user dir (e.g. /tmp/myapp.sock).","Derive the path from a short stable hash instead of full identifiers: /tmp/app-<8-char-hash>.sock.","Guard the length before connecting and fail with a clear message (empty check + ~104/108-byte limit depending on platform).","On Linux only, abstract namespace sockets (leading NUL) avoid the path-length limit entirely."],"exampleFix":"// before\nconst sockPath = `${projectRoot}/.cache/sockets/run-${Date.now()}.sock`; // > 104 bytes on macOS\nconst s = net.connect(sockPath);\n\n// after\nimport { createHash } from \"node:crypto\";\nconst maxLen = process.platform === \"darwin\" ? 103 : 107;\nconst sockPath = `/tmp/app-${createHash(\"sha1\").update(projectRoot).digest(\"hex\").slice(0, 8)}.sock`;\nif (sockPath.length === 0 || sockPath.length > maxLen) throw new Error(`socket path invalid (len ${sockPath.length})`);\nconst s = net.connect(sockPath);","handlingStrategy":"validation","validationCode":"function assertSocketPath(p) {\n  if (p.length === 0) throw new Error(\"unix socket path is empty\");\n  const max = process.platform === \"darwin\" ? 104 : 108; // sun_path incl. NUL\n  if (p.length + 1 > max) throw new Error(`unix socket path too long (${p.length} > ${max - 1}): ${p}`);\n}","typeGuard":"const isValidUnixSocketPath = (p: string): p is `${string}.sock` => p.length > 0 && p.length < (process.platform === \"darwin\" ? 104 : 108);","tryCatchPattern":"try { net.connect(sockPath); } catch (e) { if (/invalid path/.test(String(e))) throw new Error(`socket path invalid/too long (${sockPath.length} chars) — use a shorter path under /tmp`); throw e; }","preventionTips":["Put sockets in short, fixed locations (/tmp/app-<short-hash>.sock) regardless of project depth.","Beware macOS /var/folders TMPDIR — its length plus a generated name easily exceeds 103 bytes.","On Linux, consider abstract sockets to bypass the filesystem path limit entirely."],"tags":["unix-socket","pipe","libuv","node-compat","path-length","invalid-input"],"backgroundTag":"unix-socket-path-too-long","analyzedSha":"98f9507affc905f088124891add3a8dd63b91f77","analyzedAt":"2026-08-20T13:07:44.778Z","contentChangedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}