kern/128790: [patch] bug in IP_MINTTL setsockopt() implementation

Nick Hilliard nick at foobar.org
Tue Nov 11 07:40:02 PST 2008


>Number:         128790
>Category:       kern
>Synopsis:       [patch] bug in IP_MINTTL setsockopt() implementation
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Nov 11 15:40:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     Nick Hilliard
>Release:        FreeBSD 6.1-RELEASE i386
>Organization:
Network Ability Ltd
>Environment:
System: FreeBSD xx 6.1-RELEASE FreeBSD 6.1-RELEASE #0: Wed May 17 11:38:53 IST 2006 nick at xxx:/data/src/usr.src/src-6.1/src/sys/i386/compile/xxx i386

>Description:

The IP_MINTTL socket option allows implementation of GTSM - RFC 5082.  This
is useful for BGP session security, and is implemented in OpenBGPD 4.3.

>From perusing the kernel code, you can set inp->inp_ip_minttl to any value
between 1 and MAXTTL (i.e. 255).  These are permissable TTL values. 
However, when setting up the inp structure, inp_ip_minttl will be
initialised to zero.  Also, there are various checks in
/sys/netinet/raw_ip.c, /sys/netinet/tcp_input.c and
/sys/netinet/udp_usrreq.c which only perform a MINTTL check if
inp->inp_ip_minttl is set to nonzero.  This suggests that zero is a valid
value for inp_ip_minttl.

However, there is a bug in the implementation on {free,open,dragonfly}bsd
which prevents a programmer from calling the setsockopt() IP_MINTTL with a
value of zero.

Patch below to fix this behaviour.

>How-To-Repeat:

	int minttl = 0;
	ret = setsockopt (sock, IPPROTO_IP, IP_MINTTL, &minttl, sizeof(minttl));

	[expect ret == -1]

>Fix:

--- /sys/netinet/ip_output.c~	2008-11-03 15:22:39.000000000 +0000
+++ /sys/netinet/ip_output.c	2008-11-03 15:22:39.000000000 +0000
@@ -865,7 +865,7 @@
 				break;
 
 			case IP_MINTTL:
-				if (optval > 0 && optval <= MAXTTL)
+				if (optval >= 0 && optval <= MAXTTL)
 					inp->inp_ip_minttl = optval;
 				else
 					error = EINVAL;


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list