svn commit: r344517 - head/sys/kern

Andrew Turner andrew at FreeBSD.org
Mon Feb 25 13:15:35 UTC 2019


Author: andrew
Date: Mon Feb 25 13:15:34 2019
New Revision: 344517
URL: https://svnweb.freebsd.org/changeset/base/344517

Log:
  Check the index hasn't changed after writing the cmp entry.
  
  If an interrupt fires while writing the cmp entry we may have a partial
  entry. Work around this by using atomic_cmpset to set the new index. If it
  fails we need to set the previous index value and try again as the entry
  may be in an inconsistent state.
  
  This fixes messages similar to the following from syzkaller:
  bad comp 224 type 2163727253
  
  Reviewed by:	tuexen
  Sponsored by:	DARPA, AFRL
  Differential Revision:	https://reviews.freebsd.org/D19287

Modified:
  head/sys/kern/kern_kcov.c

Modified: head/sys/kern/kern_kcov.c
==============================================================================
--- head/sys/kern/kern_kcov.c	Mon Feb 25 12:35:52 2019	(r344516)
+++ head/sys/kern/kern_kcov.c	Mon Feb 25 13:15:34 2019	(r344517)
@@ -247,11 +247,16 @@ trace_cmp(uint64_t type, uint64_t arg1, uint64_t arg2,
 	if (index * 4 + 4 + 1 > info->entries)
 		return (false);
 
-	buf[index * 4 + 1] = type;
-	buf[index * 4 + 2] = arg1;
-	buf[index * 4 + 3] = arg2;
-	buf[index * 4 + 4] = ret;
-	buf[0] = index + 1;
+	while (1) {
+		buf[index * 4 + 1] = type;
+		buf[index * 4 + 2] = arg1;
+		buf[index * 4 + 3] = arg2;
+		buf[index * 4 + 4] = ret;
+
+		if (atomic_cmpset_64(&buf[0], index, index + 1))
+			break;
+		buf[0] = index;
+	}
 
 	return (true);
 }


More information about the svn-src-head mailing list