aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2020-07-11 13:11:54 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2020-07-11 13:11:54 +0000
commitce28fd95e0e576d28c08313ab2a35b79c6127b64 (patch)
tree335db2030cd6646416e06b4a2da9afb2da058b8c
parent17f701a3fba1da17bbf3baae8985868aa7710ad5 (diff)
downloadsrc-ce28fd95e0e576d28c08313ab2a35b79c6127b64.tar.gz
src-ce28fd95e0e576d28c08313ab2a35b79c6127b64.zip
Make linprocfs(5) report correct tty number in /proc/<PID>/stat.
Fixes sudo (sudo-1.8.21p2-3ubuntu1.2); previously would fail with "sudo: no tty present and no askpass program specified". Reviewed by: kib, emaste MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D25588
Notes
Notes: svn path=/head/; revision=363094
-rw-r--r--sys/compat/linprocfs/linprocfs.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c
index d0f5e2dd4404..c3d7eafd9492 100644
--- a/sys/compat/linprocfs/linprocfs.c
+++ b/sys/compat/linprocfs/linprocfs.c
@@ -767,6 +767,32 @@ linprocfs_doloadavg(PFS_FILL_ARGS)
return (0);
}
+static int
+linprocfs_get_tty_nr(struct proc *p)
+{
+ struct session *sp;
+ const char *ttyname;
+ int error, major, minor, nr;
+
+ PROC_LOCK_ASSERT(p, MA_OWNED);
+ sx_assert(&proctree_lock, SX_LOCKED);
+
+ if ((p->p_flag & P_CONTROLT) == 0)
+ return (-1);
+
+ sp = p->p_pgrp->pg_session;
+ if (sp == NULL)
+ return (-1);
+
+ ttyname = devtoname(sp->s_ttyp->t_dev);
+ error = linux_driver_get_major_minor(ttyname, &major, &minor);
+ if (error != 0)
+ return (-1);
+
+ nr = makedev(major, minor);
+ return (nr);
+}
+
/*
* Filler function for proc/pid/stat
*/
@@ -777,12 +803,14 @@ linprocfs_doprocstat(PFS_FILL_ARGS)
struct timeval boottime;
char state;
static int ratelimit = 0;
+ int tty_nr;
vm_offset_t startcode, startdata;
getboottime(&boottime);
sx_slock(&proctree_lock);
PROC_LOCK(p);
fill_kinfo_proc(p, &kp);
+ tty_nr = linprocfs_get_tty_nr(p);
sx_sunlock(&proctree_lock);
if (p->p_vmspace) {
startcode = (vm_offset_t)p->p_vmspace->vm_taddr;
@@ -809,10 +837,7 @@ linprocfs_doprocstat(PFS_FILL_ARGS)
PS_ADD("pgrp", "%d", p->p_pgid);
PS_ADD("session", "%d", p->p_session->s_sid);
PROC_UNLOCK(p);
- if (kp.ki_tdev == NODEV)
- PS_ADD("tty", "%s", "-1");
- else
- PS_ADD("tty", "%ju", (uintmax_t)kp.ki_tdev);
+ PS_ADD("tty", "%d", tty_nr);
PS_ADD("tpgid", "%d", kp.ki_tpgid);
PS_ADD("flags", "%u", 0); /* XXX */
PS_ADD("minflt", "%lu", kp.ki_rusage.ru_minflt);