[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openbsd-bugs
Subject:    relayd: config reload race with statistics
From:       Brian Brombacher <brian () planetunix ! net>
Date:       2020-07-27 4:16:55
Message-ID: 9cba70b8c227b996 () uranus ! planetunix ! net
[Download RAW message or body]

>Synopsis:	relayd config reload race condition crash
>Category:	user
>Environment:
	System      : OpenBSD 6.7
	Details     : OpenBSD 6.7-stable (PU.MP) #105: Mon Jul 20 09:18:44 EDT 2020
			 brian@uranus.planetunix.net:/home/brian/sys/arch/amd64/compile/PU.MP

	Architecture: OpenBSD.amd64
	Machine     : amd64
>Description:
	relay_statistics in relay.c runs on a timer that isn't synchronized with
	config reload.  pfe_dispatch_relay in pfe.c fails periodically with
	"invalid relay id" and exits prematurely.
>How-To-Repeat:
	Run relayctl reload periodically until crash occurs.
>Fix:
	
	Below is a patch that fixes the issue in at least one way.  I'm also
	seeing other spurious issues with connections so there may be
	other issues during config reload.

Index: pfe.c
===================================================================
RCS file: /home/brian/cvs/src/usr.sbin/relayd/pfe.c,v
retrieving revision 1.89
diff -u -r1.89 pfe.c
--- pfe.c	28 May 2017 10:39:15 -0000	1.89
+++ pfe.c	26 Jul 2020 15:28:22 -0000
@@ -270,10 +270,14 @@
 	case IMSG_STATISTICS:
 		IMSG_SIZE_CHECK(imsg, &crs);
 		bcopy(imsg->data, &crs, sizeof(crs));
-		if (crs.proc > env->sc_conf.prefork_relay)
-			fatalx("%s: invalid relay proc", __func__);
-		if ((rlay = relay_find(env, crs.id)) == NULL)
-			fatalx("%s: invalid relay id", __func__);
+		if (crs.proc > env->sc_conf.prefork_relay) {
+			log_warn("%s: invalid relay proc", __func__);
+			break;
+		}
+		if ((rlay = relay_find(env, crs.id)) == NULL) {
+			log_warn("%s: invalid relay id", __func__);
+			break;
+		}
 		bcopy(&crs, &rlay->rl_stats[crs.proc], sizeof(crs));
 		rlay->rl_stats[crs.proc].interval =
 		    env->sc_conf.statinterval.tv_sec;

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic