Module Name:    src
Committed By:   riastradh
Date:           Sun Apr 17 09:09:13 UTC 2022

Modified Files:
        src/sys/kern: subr_prf.c

Log Message:
panic(9): Serialize panicstr access and printing `panic:' message.

This isn't riskier than before -- previously we took kprintf_lock
inside each separate printf/vprintf call here.  Now we just take it
once around access to panicstr and printing the message.

With any luck, this should help avoid interleaving panic messages
with each other and with other output -- and maybe cut down on the
number of syzkaller duplicates.


To generate a diff of this commit:
cvs rdiff -u -r1.187 -r1.188 src/sys/kern/subr_prf.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/kern/subr_prf.c
diff -u src/sys/kern/subr_prf.c:1.187 src/sys/kern/subr_prf.c:1.188
--- src/sys/kern/subr_prf.c:1.187	Wed Mar 16 20:31:02 2022
+++ src/sys/kern/subr_prf.c	Sun Apr 17 09:09:13 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_prf.c,v 1.187 2022/03/16 20:31:02 andvar Exp $	*/
+/*	$NetBSD: subr_prf.c,v 1.188 2022/04/17 09:09:13 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 1986, 1988, 1991, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_prf.c,v 1.187 2022/03/16 20:31:02 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_prf.c,v 1.188 2022/04/17 09:09:13 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -96,6 +96,7 @@ static bool kprintf_inited = false;
  */
 
 static void	 putchar(int, int, struct tty *);
+static void	 kprintf_internal(const char *, int, void *, char *, ...);
 
 
 /*
@@ -261,18 +262,20 @@ vpanic(const char *fmt, va_list ap)
 	if (logenabled(msgbufp))
 		panicstart = msgbufp->msg_bufx;
 
-	printf("panic: ");
+	kprintf_lock();
+	kprintf_internal("panic: ", TOLOG|TOCONS, NULL, NULL);
 	if (panicstr == NULL) {
 		/* first time in panic - store fmt first for precaution */
 		panicstr = fmt;
 
 		vsnprintf(scratchstr, sizeof(scratchstr), fmt, ap);
-		printf("%s", scratchstr);
+		kprintf_internal("%s", TOLOG|TOCONS, NULL, NULL, scratchstr);
 		panicstr = scratchstr;
 	} else {
-		vprintf(fmt, ap);
+		kprintf(fmt, TOLOG|TOCONS, NULL, NULL, ap);
 	}
-	printf("\n");
+	kprintf_internal("\n", TOLOG|TOCONS, NULL, NULL);
+	kprintf_unlock();
 
 	if (logenabled(msgbufp))
 		panicend = msgbufp->msg_bufx;

Reply via email to