Skip to content

Commit

Permalink
src: add UV_PIPE_NO_TRUNCATE for bind in pipe_wrap.cc
Browse files Browse the repository at this point in the history
  • Loading branch information
theanarkh committed Apr 3, 2024
1 parent 4e9ce7c commit 85adc9e
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 7 deletions.
8 changes: 4 additions & 4 deletions doc/api/net.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ sockets on other operating systems.
[`socket.connect()`][] take a `path` parameter to identify IPC endpoints.

On Unix, the local domain is also known as the Unix domain. The path is a
file system pathname. It gets truncated to an OS-dependent length of
`sizeof(sockaddr_un.sun_path) - 1`. Typical values are 107 bytes on Linux and
103 bytes on macOS. If a Node.js API abstraction creates the Unix domain socket,
it will unlink the Unix domain socket as well. For example,
file system pathname. It will throw an error when the length of pathname greater
than the length of `sizeof(sockaddr_un.sun_path)`. Typical values are 107 bytes
on Linux and 103 bytes on macOS. If a Node.js API abstraction creates the Unix
domain socket, it will unlink the Unix domain socket as well. For example,
[`net.createServer()`][] may create a Unix domain socket and
[`server.close()`][] will unlink it. But if a user creates the Unix domain
socket outside of these abstractions, the user will need to remove it. The same
Expand Down
11 changes: 8 additions & 3 deletions src/pipe_wrap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,8 @@ void PipeWrap::Bind(const FunctionCallbackInfo<Value>& args) {
PipeWrap* wrap;
ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
node::Utf8Value name(args.GetIsolate(), args[0]);
int err = uv_pipe_bind2(&wrap->handle_, *name, name.length(), 0);
int err =
uv_pipe_bind2(&wrap->handle_, *name, name.length(), UV_PIPE_NO_TRUNCATE);
args.GetReturnValue().Set(err);
}

Expand Down Expand Up @@ -225,8 +226,12 @@ void PipeWrap::Connect(const FunctionCallbackInfo<Value>& args) {

ConnectWrap* req_wrap =
new ConnectWrap(env, req_wrap_obj, AsyncWrap::PROVIDER_PIPECONNECTWRAP);
int err = req_wrap->Dispatch(
uv_pipe_connect2, &wrap->handle_, *name, name.length(), 0, AfterConnect);
int err = req_wrap->Dispatch(uv_pipe_connect2,
&wrap->handle_,
*name,
name.length(),
UV_PIPE_NO_TRUNCATE,
AfterConnect);
if (err) {
delete req_wrap;
} else {
Expand Down
25 changes: 25 additions & 0 deletions test/parallel/test-net-pipe-with-long-path.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const net = require('net');
const fs = require('fs');
const tmpdir = require('../common/tmpdir');
tmpdir.refresh();

const pipePath = `${tmpdir.path}/${'x'.repeat(1000)}.sock`;

const server = net.createServer(common.mustNotCall())
.listen(pipePath)
// It may work on some operating systems
.on('listening', () => {
// The socket file must exsit
assert.ok(fs.existsSync(pipePath));
server.close();
})
.on('error', (error) => {
assert.ok(error.code === 'EINVAL');
net.connect(pipePath)
.on('error', common.mustCall((error) => {
assert.ok(error.code === 'EINVAL');
}));
});

0 comments on commit 85adc9e

Please sign in to comment.