Module Name:    src
Committed By:   christos
Date:           Wed Aug 26 23:08:29 UTC 2020

Modified Files:
        src/usr.bin/fstat: fstat.c

Log Message:
Provide a helpful error message if we don't have privs to read kernel
addresses.


To generate a diff of this commit:
cvs rdiff -u -r1.113 -r1.114 src/usr.bin/fstat/fstat.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/fstat/fstat.c
diff -u src/usr.bin/fstat/fstat.c:1.113 src/usr.bin/fstat/fstat.c:1.114
--- src/usr.bin/fstat/fstat.c:1.113	Fri Sep  6 13:08:22 2019
+++ src/usr.bin/fstat/fstat.c	Wed Aug 26 19:08:29 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: fstat.c,v 1.113 2019/09/06 17:08:22 christos Exp $	*/
+/*	$NetBSD: fstat.c,v 1.114 2020/08/26 23:08:29 christos Exp $	*/
 
 /*-
  * Copyright (c) 1988, 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 19
 #if 0
 static char sccsid[] = "@(#)fstat.c	8.3 (Berkeley) 5/2/95";
 #else
-__RCSID("$NetBSD: fstat.c,v 1.113 2019/09/06 17:08:22 christos Exp $");
+__RCSID("$NetBSD: fstat.c,v 1.114 2020/08/26 23:08:29 christos Exp $");
 #endif
 #endif /* not lint */
 
@@ -181,6 +181,7 @@ static void	vtrans(struct file *, struct
 static void	ftrans(fdfile_t *, int);
 static void	ptrans(struct file *, struct pipe *, int);
 static void	kdriver_init(void);
+static void	check_privs(void);
 
 int
 main(int argc, char **argv)
@@ -244,6 +245,8 @@ main(int argc, char **argv)
 			usage();
 		}
 
+	check_privs();
+
 	kdriver_init();
 
 	if (*(argv += optind)) {
@@ -309,6 +312,23 @@ main(int argc, char **argv)
 	return 0;
 }
 
+static void
+check_privs(void)
+{
+	int expaddr;
+	size_t expsize = sizeof(expaddr);
+	const char *expname = "kern.expose_address";
+
+	if (geteuid() == 0)
+		return;
+
+	if (sysctlbyname(expname, &expaddr, &expsize, NULL, 0) == -1)
+		err(EXIT_FAILURE, "Can't get sysctl `%s'", expname);
+	if (expaddr == 0)
+		errx(EXIT_FAILURE, "This program does not work without "
+		    "sysctl `%s' being set", expname);
+}
+
 static const	char *Uname, *Comm;
 pid_t	Pid;
 

Reply via email to