diff --git a/lib/libc/sys/listen.2 b/lib/libc/sys/listen.2 --- a/lib/libc/sys/listen.2 +++ b/lib/libc/sys/listen.2 @@ -28,7 +28,7 @@ .\" From: @(#)listen.2 8.2 (Berkeley) 12/11/93 .\" $FreeBSD$ .\" -.Dd April 14, 2020 +.Dd September 10, 2020 .Dt LISTEN 2 .Os .Sh NAME @@ -105,11 +105,13 @@ specifies a hard limit on .Fa backlog ; if a value greater than -.Va kern.ipc.soacceptqueue -or less than zero is specified, +.Va kern.ipc.soacceptqueue , .Fa backlog is silently forced to .Va kern.ipc.soacceptqueue . +If a negative value is used, +.Fa backlog +is silently forced to 0. .Pp If the listen queue overflows, the kernel will emit a LOG_DEBUG syslog message. The @@ -191,3 +193,8 @@ is still available but hidden from a .Xr sysctl 3 -a output so that existing applications and scripts continue to work. +To improve POSIX compliance, a negative +.Fa backlog +argument is handled the same as 0. +This was introduced in +.Fx 14.0 . diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1002,7 +1002,9 @@ so->so_options |= SO_ACCEPTCONN; listening: - if (backlog < 0 || backlog > somaxconn) + if (backlog < 0) + backlog = 0; + if (backlog > somaxconn) backlog = somaxconn; so->sol_qlimit = backlog;