listen(): improve POSIX compliance

Ensure that a negative backlog argument is handled as it if was 0.

Reviewed by:		markj@, glebius@
Sponsored by:		Netflix, Inc.
Differential Revision:	https://reviews.freebsd.org/D31821
This commit is contained in:
Michael Tuexen 2022-10-11 22:46:51 +02:00
parent d88131e1e5
commit 76e6e4d72f
2 changed files with 13 additions and 3 deletions

View File

@ -28,7 +28,7 @@
.\" From: @(#)listen.2 8.2 (Berkeley) 12/11/93
.\" $FreeBSD$
.\"
.Dd April 14, 2020
.Dd October 11, 2022
.Dt LISTEN 2
.Os
.Sh NAME
@ -106,10 +106,13 @@ specifies a hard limit on
.Fa backlog ;
if a value greater than
.Va kern.ipc.soacceptqueue
or less than zero is specified,
is specified,
.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 +194,8 @@ The original
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 .

View File

@ -1075,7 +1075,9 @@ solisten_proto(struct socket *so, int backlog)
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;