NetBSD Problem Report #53974

From www@NetBSD.org  Thu Feb 14 04:35:38 2019
Return-Path: <www@NetBSD.org>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(Client CN "mail.NetBSD.org", Issuer "mail.NetBSD.org CA" (not verified))
	by mollari.NetBSD.org (Postfix) with ESMTPS id 8458C7A16A
	for <gnats-bugs@gnats.NetBSD.org>; Thu, 14 Feb 2019 04:35:38 +0000 (UTC)
Message-Id: <20190214043537.95B4D7A1E9@mollari.NetBSD.org>
Date: Thu, 14 Feb 2019 04:35:37 +0000 (UTC)
From: nonakap@gmail.com
Reply-To: nonakap@gmail.com
To: gnats-bugs@NetBSD.org
Subject: arp(8): Attempting to set many ARP entries with -f option, it can cause "socket: Too many open files" error.
X-Send-Pr-Version: www-1.0

>Number:         53974
>Category:       bin
>Synopsis:       arp(8): Attempting to set many ARP entries with -f option, it can cause "socket: Too many open files" error.
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    bin-bug-people
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Feb 14 04:40:00 +0000 2019
>Closed-Date:    Mon Mar 11 16:18:41 +0000 2019
>Last-Modified:  Mon Mar 11 16:18:41 +0000 2019
>Originator:     Kimihiro Nonaka
>Release:        NetBSD/amd64 8.0_STABLE (20190212)
>Organization:
>Environment:
NetBSD netbsd 8.0_STABLE NetBSD 8.0_STABLE (NBSERVER) #54: Tue Feb 12 11:21:06 JST 2019  nonaka@netbsd:/exports/snap
shot/NetBSD/8-STABLE/obj.NetBSD-amd64/amd64/sys/arch/amd64/compile/NBSERVER amd64
>Description:

>How-To-Repeat:
$ ulimit -n 16
$ for i in $(seq 1 17); do printf "192.168.0.%d 00:00:00:00:00:%02x temp\n" $i $i; done > /tmp/a
$ arp -f /tmp/a
arp: set: can only proxy for 192.168.0.1
arp: set: can only proxy for 192.168.0.2
arp: set: can only proxy for 192.168.0.3
arp: set: can only proxy for 192.168.0.4
arp: set: can only proxy for 192.168.0.5
arp: set: can only proxy for 192.168.0.6
arp: set: can only proxy for 192.168.0.7
arp: set: can only proxy for 192.168.0.8
arp: set: can only proxy for 192.168.0.9
arp: set: can only proxy for 192.168.0.10
arp: set: can only proxy for 192.168.0.11
arp: set: can only proxy for 192.168.0.12
arp: socket: Too many open files
>Fix:

>Release-Note:

>Audit-Trail:
From: David Holland <dholland-bugs@netbsd.org>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: bin/53974: arp(8): Attempting to set many ARP entries with -f
 option, it can cause "socket: Too many open files" error.
Date: Sun, 17 Feb 2019 02:18:10 +0000

 On Thu, Feb 14, 2019 at 04:40:00AM +0000, nonakap@gmail.com wrote:
  > arp: socket: Too many open files

 Maybe it should close the sockets it opens :-)

 I'm not really in a position to test the following right now so please
 let me know if it works and doesn't blow things up.


 Index: arp.c
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/arp/arp.c,v
 retrieving revision 1.63
 diff -u -p -r1.63 arp.c
 --- arp.c	31 Jul 2018 09:45:52 -0000	1.63
 +++ arp.c	17 Feb 2019 02:16:34 -0000
 @@ -276,8 +276,10 @@ set(int argc, char **argv)
  	argc -= 2;
  	argv += 2;

 -	if (getinetaddr(host, &sin_m.sin_addr) == -1)
 +	if (getinetaddr(host, &sin_m.sin_addr) == -1) {
 +		close(s);
  		return (1);
 +	}
  	if (strcmp(eaddr, "auto") != 0 && atosdl(eaddr, &sdl_m))
  		warnx("invalid link-level address '%s'", eaddr);
  	doing_proxy = flags = export_only = expire_time = 0;
 @@ -310,13 +312,16 @@ set(int argc, char **argv)

  	}
  	if (doing_proxy && strcmp(eaddr, "auto") == 0) {
 -		if (getetheraddr(sin_m.sin_addr, &sdl_m) == -1)
 +		if (getetheraddr(sin_m.sin_addr, &sdl_m) == -1) {
 +			close(s);
  			return 1;
 +		}
  	}
  tryagain:
  	rtm = rtmsg(s, RTM_GET, NULL, &sin_m, &sdl_m);
  	if (rtm == NULL) {
  		warn("%s", host);
 +		close(s);
  		return (1);
  	}
  	sina = (struct sockaddr_inarp *)(void *)(rtm + 1);
 @@ -327,10 +332,12 @@ tryagain:
  			goto overwrite;
  		if (doing_proxy == 0) {
  			warnx("set: can only proxy for %s", host);
 +			close(s);
  			return (1);
  		}
  		if (sin_m.sin_other & SIN_PROXY) {
  			warnx("set: proxy entry exists for non 802 device");
 +			close(s);
  			return (1);
  		}
  		sin_m.sin_other = SIN_PROXY;
 @@ -341,6 +348,7 @@ overwrite:
  	if (sdl->sdl_family != AF_LINK) {
  		warnx("cannot intuit interface index and type for %s",
  		    host);
 +		close(s);
  		return (1);
  	}
  	sdl_m.sdl_type = sdl->sdl_type;
 @@ -351,6 +359,7 @@ overwrite:
  	rtm = rtmsg(s, RTM_ADD, NULL, &sin_m, &sdl_m);
  	if (vflag)
  		(void)printf("%s (%s) added\n", host, eaddr);
 +	close(s);
  	return (rtm == NULL) ? 1 : 0;
  }

 @@ -407,6 +416,7 @@ delete_one(struct rt_msghdr *rtm)
  	if (sdl->sdl_family != AF_LINK)
  		return (1);
  	rtm = rtmsg(s, RTM_DELETE, rtm, sina, sdl);
 +	close(s);
  	if (rtm == NULL)
  		return (1);
  	return (0);



 -- 
 David A. Holland
 dholland@netbsd.org

From: David Holland <dholland-bugs@netbsd.org>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: bin/53974: arp(8): Attempting to set many ARP entries with -f
 option, it can cause "socket: Too many open files" error.
Date: Tue, 26 Feb 2019 07:26:28 +0000

 On Sun, Feb 17, 2019 at 02:20:01AM +0000, David Holland wrote:
  >  I'm not really in a position to test the following right now so please
  >  let me know if it works and doesn't blow things up.

 It blows rumpity things up.

 current candidate:

 Index: arp.c
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/arp/arp.c,v
 retrieving revision 1.63
 diff -u -p -r1.63 arp.c
 --- arp.c	31 Jul 2018 09:45:52 -0000	1.63
 +++ arp.c	26 Feb 2019 07:19:19 -0000
 @@ -276,8 +276,10 @@ set(int argc, char **argv)
  	argc -= 2;
  	argv += 2;

 -	if (getinetaddr(host, &sin_m.sin_addr) == -1)
 +	if (getinetaddr(host, &sin_m.sin_addr) == -1) {
 +		prog_close(s);
  		return (1);
 +	}
  	if (strcmp(eaddr, "auto") != 0 && atosdl(eaddr, &sdl_m))
  		warnx("invalid link-level address '%s'", eaddr);
  	doing_proxy = flags = export_only = expire_time = 0;
 @@ -310,13 +312,16 @@ set(int argc, char **argv)

  	}
  	if (doing_proxy && strcmp(eaddr, "auto") == 0) {
 -		if (getetheraddr(sin_m.sin_addr, &sdl_m) == -1)
 +		if (getetheraddr(sin_m.sin_addr, &sdl_m) == -1) {
 +			prog_close(s);
  			return 1;
 +		}
  	}
  tryagain:
  	rtm = rtmsg(s, RTM_GET, NULL, &sin_m, &sdl_m);
  	if (rtm == NULL) {
  		warn("%s", host);
 +		prog_close(s);
  		return (1);
  	}
  	sina = (struct sockaddr_inarp *)(void *)(rtm + 1);
 @@ -327,10 +332,12 @@ tryagain:
  			goto overwrite;
  		if (doing_proxy == 0) {
  			warnx("set: can only proxy for %s", host);
 +			prog_close(s);
  			return (1);
  		}
  		if (sin_m.sin_other & SIN_PROXY) {
  			warnx("set: proxy entry exists for non 802 device");
 +			prog_close(s);
  			return (1);
  		}
  		sin_m.sin_other = SIN_PROXY;
 @@ -341,6 +348,7 @@ overwrite:
  	if (sdl->sdl_family != AF_LINK) {
  		warnx("cannot intuit interface index and type for %s",
  		    host);
 +		prog_close(s);
  		return (1);
  	}
  	sdl_m.sdl_type = sdl->sdl_type;
 @@ -351,6 +359,7 @@ overwrite:
  	rtm = rtmsg(s, RTM_ADD, NULL, &sin_m, &sdl_m);
  	if (vflag)
  		(void)printf("%s (%s) added\n", host, eaddr);
 +	prog_close(s);
  	return (rtm == NULL) ? 1 : 0;
  }

 @@ -407,6 +416,7 @@ delete_one(struct rt_msghdr *rtm)
  	if (sdl->sdl_family != AF_LINK)
  		return (1);
  	rtm = rtmsg(s, RTM_DELETE, rtm, sina, sdl);
 +	prog_close(s);
  	if (rtm == NULL)
  		return (1);
  	return (0);
 Index: arp_hostops.c
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/arp/arp_hostops.c,v
 retrieving revision 1.1
 diff -u -p -r1.1 arp_hostops.c
 --- arp_hostops.c	29 Jul 2015 06:07:35 -0000	1.1
 +++ arp_hostops.c	26 Feb 2019 07:19:19 -0000
 @@ -47,6 +47,7 @@ const struct prog_ops prog_ops = {

  	.op_read = read,
  	.op_write = write,
 +	.op_close = close,

  	.op_sysctl = sysctl,
  };
 Index: arp_rumpops.c
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/arp/arp_rumpops.c,v
 retrieving revision 1.1
 diff -u -p -r1.1 arp_rumpops.c
 --- arp_rumpops.c	29 Jul 2015 06:07:35 -0000	1.1
 +++ arp_rumpops.c	26 Feb 2019 07:19:19 -0000
 @@ -51,6 +51,7 @@ const struct prog_ops prog_ops = {

  	.op_read =	rump_sys_read,
  	.op_write =	rump_sys_write,
 +	.op_close =	rump_sys_close,

  	.op_sysctl =	rump_sys___sysctl,
  };
 Index: prog_ops.h
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/arp/prog_ops.h,v
 retrieving revision 1.1
 diff -u -p -r1.1 prog_ops.h
 --- prog_ops.h	29 Jul 2015 06:07:35 -0000	1.1
 +++ prog_ops.h	26 Feb 2019 07:19:19 -0000
 @@ -45,6 +45,8 @@ struct prog_ops {

  	ssize_t (*op_read)(int, void *, size_t);
  	ssize_t (*op_write)(int, const void *, size_t);
 +
 +	int (*op_close)(int);
  };
  extern const struct prog_ops prog_ops;

 @@ -54,6 +56,7 @@ extern const struct prog_ops prog_ops;
  #define prog_getpid prog_ops.op_getpid
  #define prog_read prog_ops.op_read
  #define prog_write prog_ops.op_write
 +#define prog_close prog_ops.op_close
  #define prog_sysctl prog_ops.op_sysctl
  #else
  #define prog_init ((int (*)(void))NULL)
 @@ -62,6 +65,7 @@ extern const struct prog_ops prog_ops;
  #define prog_getpid getpid
  #define prog_read read
  #define prog_write write
 +#define prog_close close
  #define prog_sysctl sysctl
  #endif



 -- 
 David A. Holland
 dholland@netbsd.org

From: "David A. Holland" <dholland@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/53974 CVS commit: src/usr.sbin/arp
Date: Wed, 27 Feb 2019 23:29:50 +0000

 Module Name:	src
 Committed By:	dholland
 Date:		Wed Feb 27 23:29:50 UTC 2019

 Modified Files:
 	src/usr.sbin/arp: arp.c arp_hostops.c arp_rumpops.c prog_ops.h

 Log Message:
 Teach arp that it's okay to close sockets after using them.
 (this requires adding a close op to the rump turds)

 Fixes PR 53974 reporting too many open files.


 To generate a diff of this commit:
 cvs rdiff -u -r1.63 -r1.64 src/usr.sbin/arp/arp.c
 cvs rdiff -u -r1.1 -r1.2 src/usr.sbin/arp/arp_hostops.c \
     src/usr.sbin/arp/arp_rumpops.c src/usr.sbin/arp/prog_ops.h

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

State-Changed-From-To: open->feedback
State-Changed-By: dholland@NetBSD.org
State-Changed-When: Wed, 27 Feb 2019 23:41:23 +0000
State-Changed-Why:
should be fixed, please test
(I filed pullup-8 #1198; that has a version of the patch that applies to
-8. If you can test that on -8, please do and report back here and/or to
releng.)


From: "Martin Husemann" <martin@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/53974 CVS commit: [netbsd-8] src/usr.sbin/arp
Date: Sun, 3 Mar 2019 11:01:48 +0000

 Module Name:	src
 Committed By:	martin
 Date:		Sun Mar  3 11:01:48 UTC 2019

 Modified Files:
 	src/usr.sbin/arp [netbsd-8]: arp.c arp_hostops.c arp_rumpops.c
 	    prog_ops.h

 Log Message:
 Pull up following revision(s) (requested by dholland in ticket #1198):

 	usr.sbin/arp/arp_rumpops.c: revision 1.2
 	usr.sbin/arp/arp_hostops.c: revision 1.2
 	usr.sbin/arp/arp.c: revision 1.64
 	usr.sbin/arp/arp.c: revision 1.65
 	usr.sbin/arp/prog_ops.h: revision 1.2

 Teach arp that it's okay to close sockets after using them.
 (this requires adding a close op to the rump turds)

 Fixes PR 53974 reporting too many open files.

  -

 arp(8): one more to close socket.


 To generate a diff of this commit:
 cvs rdiff -u -r1.55.8.4 -r1.55.8.5 src/usr.sbin/arp/arp.c
 cvs rdiff -u -r1.1 -r1.1.8.1 src/usr.sbin/arp/arp_hostops.c \
     src/usr.sbin/arp/arp_rumpops.c src/usr.sbin/arp/prog_ops.h

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: Kimihiro Nonaka <nonakap@gmail.com>
To: "gnats-bugs@NetBSD.org" <gnats-bugs@netbsd.org>
Cc: gnats-admin@netbsd.org, netbsd-bugs@netbsd.org, dholland@netbsd.org
Subject: Re: bin/53974 (arp(8): Attempting to set many ARP entries with -f
 option, it can cause "socket: Too many open files" error.)
Date: Mon, 4 Mar 2019 17:01:30 +0900

 I confirmed that it has been fixed at netbsd-8.


 On Thu, Feb 28, 2019 at 8:41 AM <dholland@netbsd.org> wrote:
 >
 > Synopsis: arp(8): Attempting to set many ARP entries with -f option, it can cause "socket: Too many open files" error.
 >
 > State-Changed-From-To: open->feedback
 > State-Changed-By: dholland@NetBSD.org
 > State-Changed-When: Wed, 27 Feb 2019 23:41:23 +0000
 > State-Changed-Why:
 > should be fixed, please test
 > (I filed pullup-8 #1198; that has a version of the patch that applies to
 > -8. If you can test that on -8, please do and report back here and/or to
 > releng.)
 >
 >
 >

State-Changed-From-To: feedback->closed
State-Changed-By: dholland@NetBSD.org
State-Changed-When: Mon, 11 Mar 2019 16:18:41 +0000
State-Changed-Why:
confirmed fixed, thanks!


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.43 2018/01/16 07:36:43 maya Exp $
$NetBSD: gnats_config.sh,v 1.9 2014/08/02 14:16:04 spz Exp $
Copyright © 1994-2017 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.