]> granicus.if.org Git - psmisc/commitdiff
pstree compiles with SE Linux
authorCraig Small <csmall@enc.com.au>
Sat, 6 Oct 2012 23:52:46 +0000 (10:52 +1100)
committerCraig Small <csmall@enc.com.au>
Sat, 6 Oct 2012 23:52:46 +0000 (10:52 +1100)
pstree failed to compile with SE Linux enabled because one of the
scontext was missed and without it enabled the bug doesn't appear.

pstree is now re-worked so scontext is defined as a dummy meaning
most of the code except the reall SE Linux specific stuff is compilied
meaning this sort of thing shouldn't happen too much again.

Bug-Gentoo: https://bugs.gentoo.org/show_bug.cgi?id=437332
Bug-Sourceforge: https://sourceforge.net/p/psmisc/bugs/54/

src/pstree.c

index db57244be3e0100d14ce80548c4fdef1287542b6..b9a01cf7e2c941486de806fd39fd98b4e364d81a 100644 (file)
@@ -47,6 +47,8 @@
 
 #ifdef WITH_SELINUX
 #include <selinux/selinux.h>
+#else
+typedef void* security_context_t; /* DUMMY to remove most ifdefs */
 #endif                                /*WITH_SELINUX */
 
 extern const char *__progname;
@@ -81,9 +83,7 @@ typedef struct _proc {
     pid_t pid;
     pid_t pgid;
     uid_t uid;
-#ifdef WITH_SELINUX
     security_context_t scontext;
-#endif                                /*WITH_SELINUX */
     char flags;
     struct _child *children;
     struct _proc *parent;
@@ -131,16 +131,14 @@ static int *more = NULL;
 
 static int print_args = 0, compact = 1, user_change = 0, pids = 0, pgids = 0,
     show_parents = 0, by_pid = 0, trunc = 1, wait_end = 0;
-#ifdef WITH_SELINUX
 static int show_scontext = 0;
-#endif                                /*WITH_SELINUX */
 static int output_width = 132;
 static int cur_x = 1;
 static char last_char = 0;
 static int dumped = 0;                /* used by dump_by_user */
 static int charlen = 0;                /* length of character */
 
-static void fix_orphans(void);
+static void fix_orphans(security_context_t scontext);
 /*
  * Allocates additional buffer space for width and more as needed.
  * The first call will allocate the first buffer.
@@ -229,15 +227,12 @@ static int out_int(int x)
     return digits;
 }
 
-#ifdef WITH_SELINUX
 static void out_scontext(security_context_t scontext)
 {
     out_string("`");
     out_string(scontext);
     out_string("'");
 }
-#endif                                /*WITH_SELINUX */
-
 
 static void out_newline(void)
 {
@@ -259,12 +254,8 @@ static PROC *find_proc(pid_t pid)
        return NULL;
 }
 
-#ifdef WITH_SELINUX
 static PROC *new_proc(const char *comm, pid_t pid, uid_t uid,
                       security_context_t scontext)
-#else                                /*WITH_SELINUX */
-static PROC *new_proc(const char *comm, pid_t pid, uid_t uid)
-#endif                                /*WITH_SELINUX */
 {
     PROC *new;
 
@@ -279,9 +270,7 @@ static PROC *new_proc(const char *comm, pid_t pid, uid_t uid)
     new->flags = 0;
     new->argc = 0;
     new->argv = NULL;
-#ifdef WITH_SELINUX
     new->scontext = scontext;
-#endif                                /*WITH_SELINUX */
     new->children = NULL;
     new->parent = NULL;
     new->next = list;
@@ -364,24 +353,14 @@ rename_proc(PROC *this, const char *comm, uid_t uid)
                }
        }
 }
-#ifdef WITH_SELINUX
 static void
 add_proc(const char *comm, pid_t pid, pid_t ppid, pid_t pgid, uid_t uid,
          const char *args, int size, char isthread, security_context_t scontext)
-#else                                /*WITH_SELINUX */
-static void
-add_proc(const char *comm, pid_t pid, pid_t ppid, pid_t pgid, uid_t uid,
-         const char *args, int size, char isthread)
-#endif                                /*WITH_SELINUX */
 {
     PROC *this, *parent;
 
     if (!(this = find_proc(pid)))
-#ifdef WITH_SELINUX
         this = new_proc(comm, pid, uid, scontext);
-#else                                /*WITH_SELINUX */
-        this = new_proc(comm, pid, uid);
-#endif                                /*WITH_SELINUX */
     else {
            rename_proc(this, comm, uid);
     }
@@ -393,11 +372,7 @@ add_proc(const char *comm, pid_t pid, pid_t ppid, pid_t pgid, uid_t uid,
     if (isthread)
       this->flags |= PFLAG_THREAD;
     if (!(parent = find_proc(ppid))) {
-#ifdef WITH_SELINUX
         parent = new_proc("?", ppid, 0, scontext);
-#else                                /*WITH_SELINUX */
-        parent = new_proc("?", ppid, 0);
-#endif
     }
     if (pid != 0) {
       add_child(parent, this);
@@ -494,12 +469,10 @@ dump_tree(PROC * current, int level, int rep, int leaf, int last,
         else
             (void) out_int(current->uid);
     }
-#ifdef WITH_SELINUX
     if (show_scontext) {
         out_char(info++ ? ',' : '(');
         out_scontext(current->scontext);
     }
-#endif                                /*WITH_SELINUX */
     if ((swapped && print_args && current->argc < 0) || (!swapped && info))
         out_char(')');
     if ((current->flags & PFLAG_HILIGHT) && (tmp = tgetstr("me", NULL)))
@@ -520,11 +493,7 @@ dump_tree(PROC * current, int level, int rep, int leaf, int last,
             }
         }
     }
-#ifdef WITH_SELINUX
     if (show_scontext || print_args || !current->children)
-#else                                /*WITH_SELINUX */
-    if (print_args || !current->children)
-#endif                                /*WITH_SELINUX */
     {
         while (closing--)
             out_char(']');
@@ -533,11 +502,7 @@ dump_tree(PROC * current, int level, int rep, int leaf, int last,
     ensure_buffer_capacity(level);
     more[level] = !last;
 
-#ifdef WITH_SELINUX
     if (show_scontext || print_args)
-#else                                /*WITH_SELINUX */
-    if (print_args)
-#endif                                /*WITH_SELINUX */
     {
         width[level] = swapped + (comm_len > 1 ? 0 : -1);
         count=0;
@@ -653,8 +618,8 @@ static void read_proc(void)
   pid_t pid, ppid, pgid;
   int fd, size;
   int empty;
-#ifdef WITH_SELINUX
   security_context_t scontext = NULL;
+#ifdef WITH_SELINUX
   int selinux_enabled = is_selinux_enabled() > 0;
 #endif                /*WITH_SELINUX */
 
@@ -726,21 +691,12 @@ static void read_proc(void)
                 while ((dt = readdir(taskdir)) != NULL) {
                   if ((thread = atoi(dt->d_name)) != 0) {
                     if (thread != pid) {
-#ifdef WITH_SELINUX
                       if (print_args)
                         add_proc(threadname, thread, pid, pgid, st.st_uid, 
                             threadname, strlen (threadname) + 1, 1,scontext);
                       else
                         add_proc(threadname, thread, pid, pgid, st.st_uid, 
                             NULL, 0, 1, scontext);
-#else                /*WITH_SELINUX */
-                      if (print_args)
-                        add_proc(threadname, thread, pid, pgid, st.st_uid,
-                            threadname, strlen (threadname) + 1, 1);
-                      else
-                        add_proc(threadname, thread, pid, pgid, st.st_uid,
-                            NULL, 0, 1);
-#endif                /*WITH_SELINUX */
                       }
                     }
                   }
@@ -749,11 +705,7 @@ static void read_proc(void)
                 }
               free(taskpath);
               if (!print_args)
-#ifdef WITH_SELINUX
                 add_proc(comm, pid, ppid, pgid, st.st_uid, NULL, 0, 0, scontext);
-#else                /*WITH_SELINUX */
-                add_proc(comm, pid, ppid, pgid, st.st_uid, NULL, 0, 0);
-#endif                /*WITH_SELINUX */
               else {
                 sprintf(path, "%s/%d/cmdline", PROC_BASE, pid);
                 if ((fd = open(path, O_RDONLY)) < 0) {
@@ -770,13 +722,8 @@ static void read_proc(void)
                   size--;
                 if (size)
                   buffer[size++] = 0;
-#ifdef WITH_SELINUX
                 add_proc(comm, pid, ppid, pgid, st.st_uid,
                      buffer, size, 0, scontext);
-#else                /*WITH_SELINUX */
-                add_proc(comm, pid, ppid, pgid, st.st_uid,
-                     buffer, size, 0);
-#endif                /*WITH_SELINUX */
               }
             }
           }
@@ -787,7 +734,7 @@ static void read_proc(void)
     }
   }
   (void) closedir(dir);
-  fix_orphans();
+  fix_orphans(scontext);
   if (print_args)
     free(buffer);
   if (empty) {
@@ -796,7 +743,7 @@ static void read_proc(void)
   }
 }
 
-static void fix_orphans(void)
+static void fix_orphans(security_context_t scontext)
 {
   /* When using kernel 3.3 with hidepid feature enabled on /proc
    * then we need fake root pid and gather all the orphan processes
@@ -807,11 +754,7 @@ static void fix_orphans(void)
   PROC *root, *walk;
 
   if (!(root = find_proc(ROOT_PID))) {
-#ifdef WITH_SELINUX
     root = new_proc("?", ROOT_PID, 0, scontext);
-#else                                /*WITH_SELINUX */
-    root = new_proc("?", ROOT_PID, 0);
-#endif
   }
   for (walk = list; walk; walk = walk->next) {
        if (walk->pid == 1 || walk->pid == 0)