summaryrefslogtreecommitdiff
path: root/devel/libgtop/files/patch-sysdeps_freebsd_suid_open.c
diff options
context:
space:
mode:
authorJoe Marcus Clarke <marcus@FreeBSD.org>2009-01-10 05:22:13 +0000
committerJoe Marcus Clarke <marcus@FreeBSD.org>2009-01-10 05:22:13 +0000
commit610ae5681637c1051a0c17b54e29d97f53da2f3a (patch)
treec231a1eb74b07e444fa7363012cb84bf23d83ce0 /devel/libgtop/files/patch-sysdeps_freebsd_suid_open.c
parentAdd a new framework for browser plugins, USE_WEBPLUGINS. It is for which foo (diff)
Presenting GNOME 2.24 for FreeBSD.
See http://library.gnome.org/misc/release-notes/2.24/ for the general release notes. On the FreeBSD front, this release introduces Fuse support in HAL, adds multi-CPU support to libgtop, WebKit updates, and fixes some long-standing seahorse and gnome-keyring bugs. The documentation updates to the website are forthcoming. This release features commits by adamw, ahze, kwm, mezz, and myself. It would not have been possible without are contributors and testers: Alexander Loginov Craig Butler [1] Dmitry Marakasov [6] Eric L. Chen Joseph S. Atkinson Kris Moore Lapo Luchini [7] Nikos Ntarmos Pawel Worach Romain Tartiere TAOKA Fumiyoshi [3] Yasuda Keisuke Zyl aZ [4] bf [2] [5] Florent Thoumie Peter Wemm pluknet PR: 125857 [1] 126993 [2] 130031 [3] 127399 [4] 127661 [5] 124302 [6] 129570 [7] 129936 123790
Diffstat (limited to 'devel/libgtop/files/patch-sysdeps_freebsd_suid_open.c')
-rw-r--r--devel/libgtop/files/patch-sysdeps_freebsd_suid_open.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/devel/libgtop/files/patch-sysdeps_freebsd_suid_open.c b/devel/libgtop/files/patch-sysdeps_freebsd_suid_open.c
new file mode 100644
index 000000000000..a188b364cbcd
--- /dev/null
+++ b/devel/libgtop/files/patch-sysdeps_freebsd_suid_open.c
@@ -0,0 +1,94 @@
+--- sysdeps/freebsd/suid_open.c.orig 2008-09-29 17:22:12.000000000 -0400
++++ sysdeps/freebsd/suid_open.c 2008-09-29 17:23:35.000000000 -0400
+@@ -0,0 +1,91 @@
++/* Copyright (C) 1998 Joshua Sled
++ This file is part of LibGTop 1.0.
++
++ Contributed by Joshua Sled <jsled@xcf.berkeley.edu>, July 1998.
++
++ LibGTop is free software; you can redistribute it and/or modify it
++ under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License,
++ or (at your option) any later version.
++
++ LibGTop is distributed in the hope that it will be useful, but WITHOUT
++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with LibGTop; see the file COPYING. If not, write to the
++ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ Boston, MA 02111-1307, USA.
++*/
++
++#include <config.h>
++#include <glibtop.h>
++#include <glibtop/error.h>
++#include <glibtop/cpu.h>
++#include <glibtop/open.h>
++#include <glibtop/init_hooks.h>
++
++
++/* !!! THIS FUNCTION RUNS SUID ROOT - CHANGE WITH CAUTION !!! */
++
++void
++glibtop_init_p (glibtop *server, const unsigned long features,
++ const unsigned flags)
++{
++ const _glibtop_init_func_t *init_fkt;
++
++ if (server == NULL)
++ glibtop_error_r (NULL, "glibtop_init_p (server == NULL)");
++
++ /* Do the initialization, but only if not already initialized. */
++
++ if ((server->flags & _GLIBTOP_INIT_STATE_SYSDEPS) == 0) {
++ glibtop_open_p (server, "glibtop", features, flags);
++
++ for (init_fkt = _glibtop_init_hook_p; *init_fkt; init_fkt++)
++ (*init_fkt) (server);
++
++ server->flags |= _GLIBTOP_INIT_STATE_SYSDEPS;
++ }
++}
++
++void
++glibtop_open_p (glibtop *server, const char *program_name,
++ const unsigned long features,
++ const unsigned flags)
++{
++#ifdef DEBUG
++ fprintf (stderr, "DEBUG (%d): glibtop_open_p ()\n", getpid ());
++#endif
++
++ /* !!! WE ARE ROOT HERE - CHANGE WITH CAUTION !!! */
++ server->machine.uid = getuid ();
++ server->machine.euid = geteuid ();
++ server->machine.gid = getgid ();
++ server->machine.egid = getegid ();
++ /* Setup machine-specific data */
++ server->machine.kd = kvm_open (NULL, NULL, NULL, O_RDONLY, "kvm_open");
++
++ if (server->machine.kd == NULL)
++ glibtop_error_io_r (server, "kvm_open");
++
++ /* Drop priviledges. */
++
++ if (setreuid (server->machine.euid, server->machine.uid))
++ _exit (1);
++
++ if (setregid (server->machine.egid, server->machine.gid))
++ _exit (1);
++
++ /* !!! END OF SUID ROOT PART !!! */
++
++ /* Our effective uid is now those of the user invoking the server,
++ * so we do no longer have any priviledges. */
++
++ /* NOTE: On FreeBSD, we do not need to be suid root, we just need to
++ * be sgid kmem.
++ *
++ * The server will only use setegid() to get back it's priviledges,
++ * so it will fail if it is suid root and not sgid kmem. */
++}