[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[hurd] 35/70: proc: add proc_mark_important server code
From: |
Samuel Thibault |
Subject: |
[hurd] 35/70: proc: add proc_mark_important server code |
Date: |
Mon, 16 Sep 2013 07:41:41 +0000 |
This is an automated email from the git hooks/post-receive script.
sthibault pushed a commit to branch upstream
in repository hurd.
commit 07031c67ab7e282e7af943f0774288922142f56c
Author: Justus Winter <address@hidden>
Date: Thu Aug 15 09:37:56 2013 +0200
proc: add proc_mark_important server code
This is based on a fragment of Guillem Jovers patch presented here:
http://lists.gnu.org/archive/html/bug-hurd/2006-02/msg00081.html
It has been refreshed, updated and the copyright year is adjusted
properly. It has been complemented with the necessary features to
address the issues the original patch set out to address, namely
that killall5 freezes the proc translator before it tries to walk
over /proc/*/stat to decide which process to kill. Prior to this
patch (and the one marking the procfs server as important
process), killall5 would deadlock trying to walk over the proc
file system.
Ironically it would not have killed any process later on even if
it had the chance, since two values obtained from /proc/*/stat
are currently hardcoded to zero in our procfs. Patches addressing
the problem as a whole are prepared and will be sent as a follow
up.
* proc/proc.h (struct proc): Add p_important field.
* proc/pgrp.c (S_proc_getpgrppids): Exclude important system processes.
(S_proc_mark_important): New function.
* proc/mgt.c (create_startup_proc): Mark init as important.
---
proc/mgt.c | 35 +++++++++++++++++++++++++++++++++++
proc/pgrp.c | 7 ++++---
proc/proc.h | 1 +
3 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/proc/mgt.c b/proc/mgt.c
index 1a881d0..6a10e91 100644
--- a/proc/mgt.c
+++ b/proc/mgt.c
@@ -593,6 +593,8 @@ create_startup_proc (void)
p->p_deadmsg = 1; /* Force initial "re-"fetch of msgport. */
+ p->p_important = 1;
+
p->p_noowner = 0;
p->p_id = make_ids (&zero, 1);
assert (p->p_id);
@@ -868,3 +870,36 @@ genpid ()
return nextpid++;
}
+
+/* Implement proc_mark_important as described in <hurd/process.defs>. */
+kern_return_t
+S_proc_mark_important (struct proc *p)
+{
+ if (!p)
+ return EOPNOTSUPP;
+
+ /* Only root may use this interface. Any children of startup_proc
+ exempt from this restriction, as startup_proc calls this on their
+ behalf. The kernel process is a notable example of an process
+ that needs this exemption. That is not an problem however, since
+ all children of /hurd/init are important and we mark them as such
+ anyway. */
+ if (! check_uid (p, 0) && ! check_owner (startup_proc, p))
+ return EPERM;
+
+ p->p_important = 1;
+ return 0;
+}
+
+/* Implement proc_is_important as described in <hurd/process.defs>. */
+error_t
+S_proc_is_important (struct proc *callerp,
+ boolean_t *essential)
+{
+ if (!callerp)
+ return EOPNOTSUPP;
+
+ *essential = callerp->p_important;
+
+ return 0;
+}
diff --git a/proc/pgrp.c b/proc/pgrp.c
index 2d6ca93..d4ea9ee 100644
--- a/proc/pgrp.c
+++ b/proc/pgrp.c
@@ -1,5 +1,5 @@
/* Session and process group manipulation
- Copyright (C) 1992,93,94,95,96,99,2001,02 Free Software Foundation, Inc.
+ Copyright (C) 1992,93,94,95,96,99,2001,02,13 Free Software Foundation, Inc.
This file is part of the GNU Hurd.
@@ -265,7 +265,7 @@ S_proc_getpgrppids (struct proc *callerp,
count = 0;
for (p = pg->pg_plist; p; p = p->p_gnext)
- if (++count <= npids)
+ if (!p->p_important && ++count <= npids)
*pp++ = p->p_pid;
if (count > npids)
@@ -278,7 +278,8 @@ S_proc_getpgrppids (struct proc *callerp,
pp = *pids;
for (p = pg->pg_plist; p; p = p->p_gnext)
- *pp++ = p->p_pid;
+ if (!p->p_important)
+ *pp++ = p->p_pid;
/* Dealloc ? XXX */
}
*npidsp = count;
diff --git a/proc/proc.h b/proc/proc.h
index b7a9566..ed47ccc 100644
--- a/proc/proc.h
+++ b/proc/proc.h
@@ -84,6 +84,7 @@ struct proc
unsigned int p_noowner:1; /* has no owner known */
unsigned int p_loginleader:1; /* leader of login collection */
unsigned int p_dead:1; /* process is dead */
+ unsigned int p_important:1; /* has called proc_mark_important */
};
typedef struct proc *pstruct_t;
--
Alioth's /usr/local/bin/git-commit-notice on
/srv/git.debian.org/git/pkg-hurd/hurd.git
- [hurd] branch upstream updated (de8b182 -> b2f8745), Samuel Thibault, 2013/09/16
- [hurd] 03/70: utils: escape arguments in fakeroot.sh, Samuel Thibault, 2013/09/16
- [hurd] 17/70: console-client: add daemonizing support, Samuel Thibault, 2013/09/16
- [hurd] 21/70: utils: add nullauth utility, Samuel Thibault, 2013/09/16
- [hurd] 22/70: Disable transparent gzip/bzip2 decompression, Samuel Thibault, 2013/09/16
- [hurd] 19/70: trans: drop privileges in the null translator, Samuel Thibault, 2013/09/16
- [hurd] 35/70: proc: add proc_mark_important server code,
Samuel Thibault <=
- [hurd] 20/70: tmpfs: drop privileges in the tmpfs translator, Samuel Thibault, 2013/09/16
- [hurd] 27/70: daemons: fix setsid(2) in console-run, Samuel Thibault, 2013/09/16
- [hurd] 14/70: Optimize translator string copy, Samuel Thibault, 2013/09/16
- [hurd] 13/70: libnetfs: properly respond to file_get_translator requests, Samuel Thibault, 2013/09/16
- [hurd] 23/70: Do not build gzip/bzip2 support, Samuel Thibault, 2013/09/16
- [hurd] 38/70: libdiskfs: register libdiskfs-based translators as important, Samuel Thibault, 2013/09/16
- [hurd] 34/70: proc: make the function check_owner available, Samuel Thibault, 2013/09/16
- [hurd] 24/70: exec: Remove #ifdef 0-out code for user specified exec servers., Samuel Thibault, 2013/09/16
- [hurd] 40/70: libtrivfs: register libtrivfs-based translators as important, Samuel Thibault, 2013/09/16
- [hurd] 36/70: hurd: add proc_mark_important, Samuel Thibault, 2013/09/16