Using mutex initializer for static variable does not compile with
authorbluhm <bluhm@openbsd.org>
Thu, 5 May 2022 09:45:15 +0000 (09:45 +0000)
committerbluhm <bluhm@openbsd.org>
Thu, 5 May 2022 09:45:15 +0000 (09:45 +0000)
witness.  Make ratecheck mutex global.
Reported-by: syzbot+9864ba1338526d0e8aca@syzkaller.appspotmail.com
sys/kern/kern_time.c

index 385d47b..ddc4421 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_time.c,v 1.155 2022/05/04 21:24:33 bluhm Exp $   */
+/*     $OpenBSD: kern_time.c,v 1.156 2022/05/05 09:45:15 bluhm Exp $   */
 /*     $NetBSD: kern_time.c,v 1.20 1996/02/18 11:57:06 fvdl Exp $      */
 
 /*
@@ -36,6 +36,7 @@
 #include <sys/resourcevar.h>
 #include <sys/kernel.h>
 #include <sys/systm.h>
+#include <sys/mutex.h>
 #include <sys/rwlock.h>
 #include <sys/proc.h>
 #include <sys/ktrace.h>
@@ -775,6 +776,8 @@ itimerdecr(struct itimerspec *itp, long nsec)
        return (0);
 }
 
+struct mutex ratecheck_mtx = MUTEX_INITIALIZER(IPL_HIGH);
+
 /*
  * ratecheck(): simple time-based rate-limit checking.  see ratecheck(9)
  * for usage and rationale.
@@ -782,13 +785,12 @@ itimerdecr(struct itimerspec *itp, long nsec)
 int
 ratecheck(struct timeval *lasttime, const struct timeval *mininterval)
 {
-       static struct mutex mtx = MUTEX_INITIALIZER(IPL_HIGH);
        struct timeval tv, delta;
        int rv = 0;
 
        getmicrouptime(&tv);
 
-       mtx_enter(&mtx);
+       mtx_enter(&ratecheck_mtx);
        timersub(&tv, lasttime, &delta);
 
        /*
@@ -800,24 +802,25 @@ ratecheck(struct timeval *lasttime, const struct timeval *mininterval)
                *lasttime = tv;
                rv = 1;
        }
-       mtx_leave(&mtx);
+       mtx_leave(&ratecheck_mtx);
 
        return (rv);
 }
 
+struct mutex ppsratecheck_mtx = MUTEX_INITIALIZER(IPL_HIGH);
+
 /*
  * ppsratecheck(): packets (or events) per second limitation.
  */
 int
 ppsratecheck(struct timeval *lasttime, int *curpps, int maxpps)
 {
-       static struct mutex mtx = MUTEX_INITIALIZER(IPL_HIGH);
        struct timeval tv, delta;
        int rv;
 
        microuptime(&tv);
 
-       mtx_enter(&mtx);
+       mtx_enter(&ppsratecheck_mtx);
        timersub(&tv, lasttime, &delta);
 
        /*
@@ -846,7 +849,7 @@ ppsratecheck(struct timeval *lasttime, int *curpps, int maxpps)
        if (*curpps + 1 > *curpps)
                *curpps = *curpps + 1;
 
-       mtx_leave(&mtx);
+       mtx_leave(&ppsratecheck_mtx);
 
        return (rv);
 }