EVIL_GROUPING_HACK

This commit is contained in:
albert 2003-09-18 02:18:43 +00:00
parent 8b04273f89
commit 4456afd68a
2 changed files with 80 additions and 11 deletions

View File

@ -2,7 +2,7 @@
* New Interface to Process Table -- PROCTAB Stream (a la Directory streams)
* Copyright (C) 1996 Charles L. Blake.
* Copyright (C) 1998 Michael K. Johnson
* Copyright 1998-2002 Albert Cahalan
* Copyright 1998-2003 Albert Cahalan
* May be distributed under the conditions of the
* GNU Library General Public License; a copy is in COPYING
*/
@ -561,7 +561,7 @@ static int listed_nextpid(PROCTAB *restrict const PT, proc_t *restrict const p,
}
//////////////////////////////////////////////////////////////////////////////////
// This "finds" processes by guessing every possible one of them.
// This "finds" processes by guessing every possible one of them!
// Return non-zero on success. (pid was handy)
static int stupid_nextpid(PROCTAB *restrict const PT, proc_t *restrict const p, char *restrict const path) {
pid_t pid = --PT->u;
@ -572,6 +572,42 @@ static int stupid_nextpid(PROCTAB *restrict const PT, proc_t *restrict const p,
return pid;
}
//////////////////////////////////////////////////////////////////////////////////
// This reads process info from proc_t structs already attached to a PROCTAB.
// Yeah, we don't retain any pointer for freeing the memory later. Oh well.
// This code is for development only.
static proc_t* predone_readproc(PROCTAB *restrict const PT, proc_t *restrict const p, char *restrict const path) {
proc_t *tmp;
proc_t *ret = NULL;
(void)path;
for(;;){
tmp = PT->vp;
if(!tmp) _exit(49); // can't happen
PT->vp = tmp->next;
if(tmp->pid == tmp->tgid){ // got a leader?
memcpy(p,tmp,sizeof(proc_t)); // copy it, pointers and all
ret = p;
break;
}
}
if(!ret) _exit(99); // can't happen
while(PT->vp){
tmp = PT->vp;
if(tmp->pid == tmp->tgid) break; // OK, next one is a leader
PT->vp = tmp->next;
}
return ret;
}
//////////////////////////////////////////////////////////////////////////////////
// This "finds" processes by pulling them off of a list.
// Return non-zero on success.
static int predone_nextpid(PROCTAB *restrict const PT, proc_t *restrict const p, char *restrict const path) {
(void)p;
(void)path;
return !!PT->vp;
}
//////////////////////////////////////////////////////////////////////////////////
/* readproc: return a pointer to a proc_t filled with requested info about the
* next process available matching the restriction set. If no more such
@ -607,6 +643,41 @@ out:
//////////////////////////////////////////////////////////////////////////////////
static void evil_grouping_hack(PROCTAB* PT){
proc_t *tp;
// first we read them
for(;;){
tp = malloc(sizeof(proc_t));
if(!tp) _exit(2);
if(!readproc(PT, tp)){
free(tp);
break;
}
tp->ring = tp;
tp->next = PT->vp;
PT->vp = tp;
}
// now we scan
tp = PT->vp;
while(tp){
if(tp->pid == tp->tgid){ // if we found a leader
proc_t *tmp = PT->vp;
while(tmp){
if(tmp != tp && tmp->tgid == tp->tgid){
tmp->ring = tp->ring;
tp->ring = tmp;
}
tmp = tmp->next;
}
}
tp = tp->next;
}
// later, readproc returns what we already have
PT->finder = predone_nextpid;
PT->reader = predone_readproc;
}
// initiate a process table scan
PROCTAB* openproc(int flags, ...) {
va_list ap;
@ -623,7 +694,7 @@ PROCTAB* openproc(int flags, ...) {
}
PT->flags = flags;
if(getenv("EVIL_PROC_HACK")){
if(getenv("EVIL_FINDER_HACK")){ // for development only
PT->finder = stupid_nextpid;
PT->u = 10000;
}
@ -637,6 +708,8 @@ PROCTAB* openproc(int flags, ...) {
}
va_end(ap); /* Clean up args list */
if(getenv("EVIL_GROUPING_HACK")) evil_grouping_hack(PT);
return PT;
}

View File

@ -4,7 +4,7 @@
* New Interface to Process Table -- PROCTAB Stream (a la Directory streams)
* Copyright 1996 Charles L. Blake.
* Copyright 1998 Michael K. Johnson
* Copyright 1998-2002 Albert Cahalan
* Copyright 1998-2003 Albert Cahalan
* May be distributed under the terms of the
* GNU Library General Public License, a copy of which is provided
* in the file COPYING
@ -14,10 +14,6 @@
#define SIGNAL_STRING
#ifdef FLASK_LINUX
#include <fs_secure.h>
#endif
EXTERN_C_BEGIN
/*
@ -124,6 +120,9 @@ typedef struct proc_t {
sgroup[16], /* saved group name */
fgroup[16], /* filesystem group name */
cmd[16]; /* basename of executable file in call to exec(2) */
struct proc_t
*ring, // thread group ring
*next; // various library uses
int
ruid, rgid, /* real */
euid, egid, /* effective */
@ -136,9 +135,6 @@ typedef struct proc_t {
tgid, /* thread group ID */
exit_signal, /* might not be SIGCHLD */
processor; /* current (or most recent?) CPU */
#ifdef FLASK_LINUX
security_id_t secsid;
#endif
} proc_t;
/* PROCTAB: data structure holding the persistent information readproc needs