who(1) patch for unveil violation

2020-08-27 Thread David Goerger

Hello,

This morning I was surprised to see a who(1) unveil violation in a
lastcomm(1) report, so I looked into it and found that when requesting
show_idle (-u flag) or show_term (-T flag), we indeed try to read
_PATH_DEV, which isn't unveiled yet.

I'm not an unveil(2) expert, and there might be a better way to handle
this, but I confirmed this fixes both case 0 (no file arg) and case 1
(e.g. `who -u /var/log/wtmp`). Tested on a -current snapshot from
yesterday, as well as on an up-to-date 6.7-stable box.

Cheers,
David

===
--- who.c.orig  Thu Aug 27 06:24:18 2020
+++ who.c   Thu Aug 27 06:40:52 2020
@@ -124,6 +124,10 @@

if (unveil(_PATH_UTMP, "r") == -1)
err(1, "unveil");
+   if (show_term || show_idle) {
+   if (unveil(_PATH_DEV, "r") == -1)
+   err(1, "unveil");
+   }
switch (argc) {
case 0: /* who */
if (pledge("stdio rpath getpw", NULL) == -1)



Re: who(1) patch for unveil violation

2020-08-27 Thread Sebastien Marie
On Thu, Aug 27, 2020 at 07:00:22AM -0400, David Goerger wrote:
> Hello,
> 
> This morning I was surprised to see a who(1) unveil violation in a
> lastcomm(1) report, so I looked into it and found that when requesting
> show_idle (-u flag) or show_term (-T flag), we indeed try to read
> _PATH_DEV, which isn't unveiled yet.
> 
> I'm not an unveil(2) expert, and there might be a better way to handle
> this, but I confirmed this fixes both case 0 (no file arg) and case 1
> (e.g. `who -u /var/log/wtmp`). Tested on a -current snapshot from
> yesterday, as well as on an up-to-date 6.7-stable box.
> 
> Cheers,
> David

The diff is ok semarie@

who(1) is doing stat(2) on line to determine +/- mode of the tty (for
show_term) or to determine the idle time using st_atime (show_idle).

> ===
> --- who.c.orig  Thu Aug 27 06:24:18 2020
> +++ who.c   Thu Aug 27 06:40:52 2020
> @@ -124,6 +124,10 @@
> 
> if (unveil(_PATH_UTMP, "r") == -1)
> err(1, "unveil");
> +   if (show_term || show_idle) {
> +   if (unveil(_PATH_DEV, "r") == -1)
> +   err(1, "unveil");
> +   }
> switch (argc) {
> case 0: /* who */
> if (pledge("stdio rpath getpw", NULL) == -1)
> 

-- 
Sebastien Marie