Module Name:    src
Committed By:   martin
Date:           Tue Jul 10 14:41:31 UTC 2018

Modified Files:
        src/sys/net [netbsd-8]: if_llatbl.c

Log Message:
Pull up following revision(s) (requested by ozaki-r in ticket #918):

        sys/net/if_llatbl.c: revision 1.28

Don't overwrite an existing llentry on RTM_ADD to avoid race conditions
Reported and tested by christos@


To generate a diff of this commit:
cvs rdiff -u -r1.18.6.4 -r1.18.6.5 src/sys/net/if_llatbl.c

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

Modified files:

Index: src/sys/net/if_llatbl.c
diff -u src/sys/net/if_llatbl.c:1.18.6.4 src/sys/net/if_llatbl.c:1.18.6.5
--- src/sys/net/if_llatbl.c:1.18.6.4	Sat Jun  9 14:44:33 2018
+++ src/sys/net/if_llatbl.c	Tue Jul 10 14:41:31 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_llatbl.c,v 1.18.6.4 2018/06/09 14:44:33 martin Exp $	*/
+/*	$NetBSD: if_llatbl.c,v 1.18.6.5 2018/07/10 14:41:31 martin Exp $	*/
 /*
  * Copyright (c) 2004 Luigi Rizzo, Alessandro Cerri. All rights reserved.
  * Copyright (c) 2004-2008 Qing Li. All rights reserved.
@@ -677,7 +677,7 @@ lla_rt_output(const u_char rtm_type, con
 
 		/* Add static LLE */
 		IF_AFDATA_WLOCK(ifp);
-		lle = lla_lookup(llt, 0, dst);
+		lle = lla_lookup(llt, LLE_EXCLUSIVE, dst);
 
 		/* Cannot overwrite an existing static entry */
 		if (lle != NULL &&
@@ -689,8 +689,18 @@ lla_rt_output(const u_char rtm_type, con
 			error = EEXIST;
 			goto out;
 		}
-		if (lle != NULL)
-			LLE_RUNLOCK(lle);
+
+		/*
+		 * We can't overwrite an existing entry to avoid race
+		 * conditions so remove it first.
+		 */
+		if (lle != NULL) {
+			size_t pkts_dropped = llentry_free(lle);
+			if (dst->sa_family == AF_INET) {
+				arp_stat_add(ARP_STAT_DFRDROPPED,
+				    (uint64_t)pkts_dropped);
+			}
+		}
 
 		lle = lla_create(llt, 0, dst, rt);
 		if (lle == NULL) {

Reply via email to