Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Mar 2020 22:27:17 +0000 (UTC)
From:      Conrad Meyer <cem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r359053 - head/sys/kern
Message-ID:  <202003172227.02HMRHLM086023@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cem
Date: Tue Mar 17 22:27:16 2020
New Revision: 359053
URL: https://svnweb.freebsd.org/changeset/base/359053

Log:
  Implement sysctl kern.boot_id
  
  Boot IDs are random, opaque 128-bit identifiers that distinguish distinct
  system boots.  A new ID is generated each time the system boots.  Unlike
  kern.boottime, the value is not modified by NTP adjustments.  It remains fixed
  until the machine is restarted.
  
  PR:		244867
  Reported by:	Ricardo Fraile <rfraile AT rfraile.eu>
  MFC after:	I do not intend to, but feel free

Modified:
  head/sys/kern/kern_mib.c

Modified: head/sys/kern/kern_mib.c
==============================================================================
--- head/sys/kern/kern_mib.c	Tue Mar 17 21:29:03 2020	(r359052)
+++ head/sys/kern/kern_mib.c	Tue Mar 17 22:27:16 2020	(r359053)
@@ -448,6 +448,32 @@ SYSCTL_PROC(_kern, KERN_HOSTID, hostid,
     CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_PRISON | CTLFLAG_MPSAFE | CTLFLAG_CAPRD,
     NULL, 0, sysctl_hostid, "LU", "Host ID");
 
+static struct mtx bootid_lk;
+MTX_SYSINIT(bootid_lock, &bootid_lk, "bootid generator lock", MTX_DEF);
+
+static int
+sysctl_bootid(SYSCTL_HANDLER_ARGS)
+{
+	static uint8_t boot_id[16];
+	static bool initialized = false;
+
+	mtx_lock(&bootid_lk);
+	if (!initialized) {
+		if (!is_random_seeded()) {
+			mtx_unlock(&bootid_lk);
+			return (ENXIO);
+		}
+		arc4random_buf(boot_id, sizeof(boot_id));
+		initialized = true;
+	}
+	mtx_unlock(&bootid_lk);
+
+	return (SYSCTL_OUT(req, boot_id, sizeof(boot_id)));
+}
+SYSCTL_PROC(_kern, OID_AUTO, boot_id,
+    CTLTYPE_STRUCT | CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_CAPRD,
+    NULL, 0, sysctl_bootid, "", "Random boot ID");
+
 /*
  * The osrelease string is copied from the global (osrelease in vers.c) into
  * prison0 by a sysinit and is inherited by child jails if not changed at jail



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202003172227.02HMRHLM086023>