Commit Graph

3263 Commits

Author SHA1 Message Date
Jameson Nash
046aebe79b
win,pipe: skip IOCP for pipe handles (#5071)
Copy the optimization from tcp/udp stack: when read/writes don't require
IOCP to complete, put them directly right into the pending queue, so
they can be processed without a full loop through IOCP each time to
drain them asynchronously.
2026-03-24 10:45:00 -04:00
Jameson Nash
fa0ac9ec0c
io: make libuv 64-bit safe (#5076)
Because libuv truncates the result of every call to INT32_MAX, it needs
to internally limit operations to INT32_MAX to be safe to use libuv.
This isn't an API change, since these operations weren't guaranteed to
work, and in fact usually failed in bizare ways already. This is very
long in coming, since we've had a lot of compiler warnings about this
and several PRs to fix this open for a decade, but the main consumers
that usually fix things didn't care (nodejs is 32-bit and julia patched
this downstream more than a decade ago, though it did run into this
again recently by mistake with sendfile).

Replaces #1501
Fixes #3360
2026-03-24 10:32:27 -04:00
BarryLhm
e3a27e0728
android: fix termux build (#5093)
Fixes: https://github.com/libuv/libuv/issues/5092
2026-03-24 09:59:50 +01:00
Ben Noordhuis
8877568581
unix: enforce recvmmsg buffer size requirements (#5095)
The documentation already stated that the receive buffer should be
a multiple of 64 KiB when the UV_UDP_RECVMMSG is used, but make that
more prominent in the documentation and enforce it in the code.

Refs: https://github.com/libuv/libuv/security/advisories/GHSA-r846-fxvr-f3rx
2026-03-23 21:25:33 +01:00
Jameson Nash
9f0101dcb8
linux: close streams without an extra read (#3250) 2026-03-21 15:10:05 -04:00
Ben Noordhuis
1f56978a28
unix: check return value of fcntl call (#5089)
The fcntl cannot fail at this point but let's check the return code
anyway, just in case.

Fixes: https://github.com/libuv/libuv/issues/5080
2026-03-21 13:18:13 +01:00
Jameson Nash
58418d5310
process: better validation for process->pid usage (#3539)
Previously, the user might unknowingly close a uv_process_t before
doing waitpid on the zombie, leaving it forever undead. Track the state
of the child, so that the application wrapper can avoid this by calling
uv_process_kill and checking for UV_ESRCH error.
2026-03-19 15:28:02 -04:00
Benjamin Gilbert
fa38eb43df
win: fix some compiler warnings (#5070)
* win: initialize INIT_ONCE field with dedicated initializer
Fixes: abc9767034 ("win: simplify uv_once implementation")
* win: indendation fixes
* win: squash some compiler warnings
2026-03-17 00:19:14 -04:00
Edy Silva
919b92d944
unix: support long path names in pipe.c (#5047)
Continues: #4676
Fixes: #2826
2026-03-16 23:14:47 -04:00
Juan José
6f096c9d03
darwin: replace EV_OOBAND handling with EVFILT_EXCEPT + NOTE_OOB (#4906)
Fixes: https://github.com/libuv/libuv/issues/3947
Re-lands: https://github.com/libuv/libuv/pull/4597

Signed-off-by: Juan José Arboleda <soyjuanarbol@gmail.com>
2026-03-16 22:23:06 -04:00
Juan José
fe89c7df39
inet: prefer sizeof with parenthesis (#4789)
This is not precisely a strict rule, but this syntax is reinforced in many
large C projects like the Linux kernel and cURL.

Signed-off-by: Juan José Arboleda <soyjuanarbol@gmail.com>
2026-03-16 21:49:26 -04:00
Gabriel Baraldi
b84a067e0f
unix,tty: don't drain when setting the TTY mode (#4945)
This avoids a blocking syscall (essentially a write)–and thus potential
deadlock–in the asynchronous IO path.
2026-03-16 21:48:50 -04:00
cui
40c800e5fc
unix,stream: verify uv_try_write2 handle (#5035)
Looks like this was simply missed in #3183 because it was a bit outside
the review context window.
2026-03-15 10:13:52 -04:00
Jameson Nash
10902ab616
unix: improve handling of uv_async_send mistakes (#5058)
When the user calls uv_async_send concurrently with uv_loop_close, we
try to prevent that data race from actually accessing undefined behavior
by setting the pending flag atomically with the busy flag. This was
proposed in the original PR, but we didn't have motivation to go with
this implementation until a user pointed out that it improves behavior
of the race window in more cases.
2026-03-15 10:00:48 -04:00
Oren
88d6d362f6
udp: validate nbufs in send functions 2026-03-14 12:05:35 +01:00
locus-x64
ec0ab5d77d
win: fix off-by-one in utf-16 to wtf-8 conversion (#5050)
Reserve one byte for the NUL terminator when passing the buffer size
to uv_utf16_to_wtf8() in the TTY line-read path. Without this, when
all input characters encode to exactly 3 UTF-8 bytes (e.g. CJK) and
the buffer size is divisible by 3, the NUL terminator is written one
byte past the allocated buffer.

The other two call sites in src/win/util.c already subtract 1 before
calling uv_utf16_to_wtf8(). This aligns tty.c with that convention.

Fixes commit f3889085 ("win,tty: convert line-read UTF-16 to WTF-8")
from October 2023.

Refs: https://github.com/libuv/libuv/security/advisories/GHSA-4prr-4742-3ccf
2026-03-13 11:59:12 +01:00
Ben Noordhuis
d2a45ce364
win: fix const correctness warning (#5057)
And fix it by calling uv_free_cpu_info so we don't repeat repeat
ourselves.
2026-03-11 22:43:35 +01:00
apocelipes
6cdf71da80
win: fix const correctness compiler error (#5049) 2026-03-11 21:14:59 +01:00
Ben Noordhuis
a43e543dbf
unix: fix pedantic compiler warnings (#5052)
Fixes: https://github.com/libuv/libuv/issues/5051
2026-03-11 19:46:54 +01:00
Juan José
b030b02a3e
linux: fix crash if poll callback closes handle before POLLERR (#5039)
Previously, `uv__udp_io` would proceed to call `uv__udp_recvmsg` for
the `POLLERR` event even if the handle was just closed by the `POLLIN`
callback.

This commit adds a guard to verify the handle is still active before
processing the error queue. It also adds a regression test that
mimics this recursive closure behavior.

Fixes: https://github.com/libuv/libuv/issues/5030

Signed-off-by: Juan José Arboleda <soyjuanarbol@gmail.com>
2026-03-06 15:00:09 -05:00
Rudi Heitbaum
e62ccbf770 unix: do not cast to char variables that are const char
Fix the casting of const char varaibles with const char returns from
functions, when the data being returned is not being modified.  Includes
the part revert of "unix: fix compilation warnings with GCC 15"

This reverts commit 50ed2fd7bd.
2026-03-06 18:06:19 +01:00
Rudi Heitbaum
5243d19134 unix: fix discard const
Do not cast const char to char unnecessarily. Refactor function to use
char s only when slash is in the path.

Fixes:

[6/73] Building C object CMakeFiles/uv.dir/src/inet.c.o
../src/inet.c: In function 'uv_inet_pton':
../src/inet.c:157:7: warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
  157 |     p = strchr(src, '%');
      |       ^

Signed-off-by: Rudi Heitbaum <rudi@heitbaum.com>
2026-03-06 18:06:19 +01:00
Saúl Ibarra Corretgé
50ed2fd7bd unix: fix compilation warnings with GCC 15
~~~
libuv/src/unix/internal.h: In function ‘uv__basename_r’:
libuv/src/unix/internal.h:480:12: warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  480 |   return s + 1;

libuv/src/unix/linux.c: In function ‘uv__cgroup1_find_cpu_controller’:
libuv/src/unix/linux.c:2377:22: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
 2377 |   char* cgroup_cpu = strstr(cgroup, ":cpu,");
      |                      ^~~~~~

libuv/src/unix/linux.c: In function ‘uv_cpu_info’:
libuv/src/unix/linux.c:1903:20: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
 1903 |       .model     = p + c->model * sizeof(*model),
      |                    ^
~~~
2026-03-02 15:56:50 +01:00
Quaylyn Rimer
12d0dd48e3
Fix const-correctness warning in linux.c (#4843)
Fix #4814 by adding const annotation when assigning string literal
"unknown" to `char*` pointer.

This eliminates compiler warnings when building with strict
const-correctness flags like `-Wwrite-strings`.
2026-02-20 20:20:14 -05:00
Saúl Ibarra Corretgé
edfc95dbd7 unix,win: support NULL loop for sync uv_getaddrinfo
Brings symmetry with the uv_fs_xxx APIs.
2026-02-19 13:18:14 +01:00
Jameson Nash
1eacb1386f
unix: check RLIMIT_AS and RLIMIT_DATA in uv_get_constrained_memory (#4899)
Add uv__get_rlimit_max_memory() helper that checks RLIMIT_AS and
RLIMIT_DATA resource limits across all Unix platforms. This helper
returns the minimum of these rlimits if set.

Update all Unix platform implementations of uv_get_constrained_memory()
to use this helper, ensuring consistent handling of resource limits:
- Linux: combine cgroup limits with rlimits
- z/OS: combine RLIMIT_MEMLIMIT with rlimits
- Other Unix platforms: use rlimits (previously returned 0)

This provides a more accurate view of available memory when processes
have rlimit constraints in addition to platform-specific limits.

Related: https://github.com/JuliaLang/julia/pull/51656
Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-13 20:54:29 -05:00
Saúl Ibarra Corretgé
26a97ad442 unix,udp: fix -Wgnu-folding-constant warning
~~~
/Users/saghul/src/libuv/src/unix/udp.c:1460:26: warning: variable length array folded to constant array as an extension [-Wgnu-folding-constant]
 1460 |   struct sockaddr* addrs[N];
      |                          ^
/Users/saghul/src/libuv/src/unix/udp.c:1461:22: warning: variable length array folded to constant array as an extension [-Wgnu-folding-constant]
 1461 |   unsigned int nbufs[N];
      |                      ^
/Users/saghul/src/libuv/src/unix/udp.c:1462:18: warning: variable length array folded to constant array as an extension [-Wgnu-folding-constant]
 1462 |   uv_buf_t* bufs[N];
      |                  ^
3 warnings generated.
/Users/saghul/src/libuv/src/unix/udp.c:1460:26: warning: variable length array folded to constant array as an extension [-Wgnu-folding-constant]
 1460 |   struct sockaddr* addrs[N];
      |                          ^
/Users/saghul/src/libuv/src/unix/udp.c:1461:22: warning: variable length array folded to constant array as an extension [-Wgnu-folding-constant]
 1461 |   unsigned int nbufs[N];
      |                      ^
/Users/saghul/src/libuv/src/unix/udp.c:1462:18: warning: variable length array folded to constant array as an extension [-Wgnu-folding-constant]
 1462 |   uv_buf_t* bufs[N];
      |                  ^
~~~
2026-02-05 20:11:10 +01:00
StefanStojanovic
01f4f89503 win: fix uv_get_process_title
Fixes: https://github.com/libuv/libuv/issues/2667
2026-02-05 11:54:22 +01:00
mischief
71801576eb unix: make OpenBSD uv_exepath work
some users of libuv rely on uv_exepath to be an actual path to a
program. unfortunately, the OpenBSD KERN_PROC_ARGV sysctl just returns
what is in argv[0], so if the program was executed by being looked up in
$PATH, uv_exepath would only return the basename and not an actual path.

to fix, this use the same approach as IBM i, OS/390 and AIX by searching
with uv__search_path. this is also the same approach the Zig language
has taken for the similar selfExePath function for OpenBSD.

the tests expect that uv_exepath still works after uv_set_process_title,
which on BSD is a call to setproctitle. the place setproctitle stores to
is the same place that KERN_PROC_ARGV reads from, so we need to stash
the original argv[0] in uv_setup_args to recover it later in uv_exepath.
2026-02-05 11:45:49 +01:00
Han Gao
e50d4e672e
unix: implement cpu_relax() for riscv64 (#5019)
Signed-off-by: Han Gao <gaohan@iscas.ac.cn>
2026-02-04 22:46:14 +01:00
tobil4sk
73bfbb995f
idna: fix assert in wtf8_to_utf16 conversion (#5021)
0x10FFFF is the valid max unicode character, so the check should be
inclusive.

This assert gets triggered because uv__wtf8_decode1 (used by
uv_wtf8_length_as_utf16) has the correct code_point <= 0x10FFFF check,
so the sequence is treated as valid and it will be passed into
uv_wtf8_to_utf16, where the incorrect assert gets triggered:

src/idna.c:397: uv_wtf8_to_utf16: Assertion `code_point < 0x10FFFF' failed.
2026-02-04 21:55:43 +01:00
Ben Noordhuis
fc90bb9843
unix: remove sunpro references (#5017)
Sun Studio / Oracle Developer Studio hasn't had a release in almost
nine years. If Oracle doesn't feel like supporting it, then neither
do I.
2026-02-02 23:15:38 +01:00
Santiago Gimeno
c68ca444e7
win: refactor to support large statfs blocks (#5016)
Accomplish this by replacing `GetDiskFreeSpaceW()` with
`NtQueryVolumeInformationFile()` which allows us to represent blocks
larger than 2^32 - 1 via
`FILE_FS_FULL_SIZE_INFORMATION.TotalAllocationUnits`.

Expanded `fs_statfs` test to check that `uv_fs_statfs()` also works with
files, meaning https://github.com/libuv/libuv/issues/2683 remains fixed
without the need of https://github.com/libuv/libuv/pull/2695.
2026-02-02 10:04:36 +01:00
Ben Noordhuis
91dc2389cc
unix,win: check nbufs argument is reasonable (#5014)
Catch sign conversion bugs by introducing a bounds check that doubles
as a sanity check.

Fixes: https://github.com/libuv/libuv/issues/5012
2026-02-01 13:03:07 +01:00
Ben Noordhuis
4cb6a2d33c
unix: factor out common i/o poll code (#5000) 2026-01-18 22:32:36 +01:00
Ben Noordhuis
2e2114ed89
unix: fix partial read handling after POLLHUP (#4997)
It was reported that PTYs on Linux sometimes report POLLHUP, return a
partial read, but still return more data on the next read.

Libuv contains an optimization where it assumes a partial read after
POLLHUP means the next read can be skipped because it's going to fail
with EOF anyway. That assumption was thought to be always true but,
alas, it isn't.

The fact the optimization has been present for 13 years and this is the
first bug report about it, indicates how rare this particular condition
is, but of course we can't skim on correctness.

The reworked optimization only uses POLLHUP as an input signal when
POLLIN is not also set. That means we no longer have to track partial
reads because we're going to try and read anyway as long as POLLIN is
set. It seems to cause no measurable regressions on the test suite or
the (lightly tested) benchmarks.

Fixes: https://github.com/libuv/libuv/issues/4992
2026-01-18 12:21:53 +01:00
Cody Tapscott
588ea9b913
win: readlink support for IO_REPARSE_TAG_LX_SYMLINK (#4994)
This adds support for "Linux"-style Windows symbolic links, reparse tag
0xA000001D (IO_REPARSE_TAG_LX_SYMLINK).
2026-01-16 10:38:18 +01:00
Ben Noordhuis
91ae02a63d
unix,win: add f_frsize field to uv_statfs_t (#4984)
Fixes: https://github.com/libuv/libuv/issues/4983
2026-01-01 22:33:44 +01:00
Oblivionsage
3e9ae1bca0
unix: remove handle from queue on uv_spawn() error (#4980)
If uv_spawn() fails after uv__handle_init() has been called, the handle
remains in loop->handle_queue. This causes use-after-free if the handle
is stack-allocated or freed, and a subsequent loop operation like
uv_walk() accesses it.

This follows the same pattern as uv_tcp_init_ex() which explicitly
removes the handle from the queue on error.
2025-12-26 16:53:42 +01:00
chemodax
ada5131840 win: Optimize file/directory delete.
Use GetFileInformationByHandleEx(FileBasicInfo) instead of GetFileInformationByHandle() because it's cheaper -- one syscall, instead of two [1]

[1]: https://blog.axiorema.com/engineering/hidden-cost-getfileinformationbyhandle/
2025-12-12 08:46:10 +01:00
Santiago Gimeno
fd89e63f2f linux: fix uv_fs_ftruncate io_uring implementation (#4963 2/2)
The `offset` field should be assigned to ithe `io_uring_sqe.off` field.
2025-12-08 10:31:45 +01:00
Ambuj Vashistha
9640bc6510
unix,win: fix leak in uv_os_environ error path (#4960) 2025-12-06 22:04:49 +01:00
Ben Noordhuis
d7dda9edfe
win: handle sshfs-win quirk in uv_fs_readdir() (#4953)
The initial FindFirstFile can fail with ERROR_FILE_NOT_FOUND, meaning
no matches (read: empty directory), which leaves dir_handle set to
INVALID_HANDLE_VALUE. Not an actual error, it just means no results.

I can't get FindFirstFile to work like that on regular file systems
but it's been reported that it does under sshfs-win and the MSDN
documentation clearly states it's possible. Handle it.

Fixes: https://github.com/libuv/libuv/issues/4952
2025-12-02 16:37:17 +01:00
Ayush Kumar
bf44c3fdcc
unix: support nanosecond resolution in uv__fs_to_timespec (#4951)
Remove the microsecond truncation in uv__fs_to_timespec() function to enable
full nanosecond resolution support. The utimensat() system call already
supports nanosecond precision, so the artificial truncation to microseconds
is no longer necessary.

This allows file modification and access times to be set with full nanosecond
precision instead of being limited to microsecond resolution.

Fixes the TODO comment about removing the microsecond resolution limit.
2025-12-02 08:42:44 +01:00
Ben Noordhuis
8fc70344df
win: fix race in uv_fs_event_start() (#4948)
Fetch file metadata by handle instead of by path, otherwise there is a
race window between fetching and acting on said metadata where another
process can replace the file with another one.

There is still a potential race when upgrading the short path to a long
path but that that one is intrinsic. It's not something libuv can solve
except by refraining from calling GetLongPathName.

Fixes: https://github.com/libuv/libuv/issues/4568
2025-11-29 20:21:40 +01:00
Andy Pan
f6e19be743 win: rename minimal_windows10_version1709() for libuv's convention
---------

Signed-off-by: Andy Pan <i@andypan.me>
2025-11-22 15:43:50 +01:00
Ben Noordhuis
b33162dd0b
unix: fix use of uninitialized variable (#4924)
The `flags` argument to `uv__udp_recvmsg_errqueue` was not initialized
in all code paths. Shuffle code around to make the control flow more
obvious (at the cost of a less legible diff.)

Also fixes an unused label warning when building on systems that aren't
Linux.

Introduced last month in commit 80a5e3ba0, "linux: add MSG_ERRQUEUE
ipv4/ipv6 udp support".
2025-11-06 22:34:44 +01:00
Christian Guinard
a944c422cc
darwin: better heuristic for available memory (#4908)
Fixes: https://github.com/libuv/libuv/issues/3897
2025-10-15 08:35:42 +02:00
Ben Noordhuis
f3ce527ea9
ibmi: add stub function to satisfy linker (#4905)
Add a stub function for no-ahafs builds. src/unix/core.c won't actually
call uv__ahafs_event but the linker still needs to see a symbol.

Like commit 87943b03 but for IBM i instead of AIX this time.
2025-10-07 23:08:33 +02:00
Juan José
80a5e3ba01
linux: add MSG_ERRQUEUE ipv4/ipv6 udp support (#4902)
Fixes: https://github.com/libuv/libuv/issues/4447
Signed-off-by: Juan José Arboleda <soyjuanarbol@gmail.com>
Co-authored-by: theanarkh <theratliter@gmail.com>
2025-10-06 16:45:58 +02:00