Changeset 321


Ignore:
Timestamp:
Mar 17, 2011, 10:07:44 PM (9 years ago)
Author:
katerina
Message:

Fix for ticket #240: The samhain_kmem kernel module should be loaded earlier

Location:
trunk
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/configure.ac

    r310 r321  
    1212dnl start
    1313dnl
    14 AM_INIT_AUTOMAKE(samhain, 2.8.2)
     14AM_INIT_AUTOMAKE(samhain, 2.8.3)
    1515AC_DEFINE([SAMHAIN], 1, [Application is samhain])
    1616AC_CANONICAL_HOST
     
    19741974
    19751975sh_insmod_cmd=": # no kernel module"
     1976sh_insmod_pre=": # no kernel module"
    19761977sh_lkm=""
    19771978lkm_inc=""
     
    21512152
    21522153                           sh_lkm="${sh_lkm} samhain_kmem.ko"
    2153                            echo "${sh_insmod_cmd}" | grep 'no kernel module' >/dev/null
    2154                            if [ $? -eq 0 ]; then
    2155                               sh_insmod_cmd="modprobe ${install_name}_kmem"
    2156                            else
    2157                               sh_insmod_cmd="modprobe ${install_name}_kmem; ${sh_insmod_cmd}"
    2158                            fi
     2154                           sh_insmod_pre="modprobe ${install_name}_kmem"
     2155
    21592156                        fi
    21602157                else
     
    21682165AC_SUBST(sh_lkm)
    21692166AC_SUBST(sh_insmod_cmd)
     2167AC_SUBST(sh_insmod_pre)
    21702168
    21712169AC_SUBST(systemmap)
  • trunk/docs/Changelog

    r315 r321  
    112.8.3:
     2        * init scripts: load samhain_kmem.ko before samhain starts
     3        * slib.c: eliminate mutex from sl_create_ticket()
     4        * sh_entropy.c: move pthread usage out of child
     5        * sh_hash.c, sh_pthread.c, sh_pthread.h: sh_hash_hashdelete()
     6          needs deadlock detection, may be called from within sh_hash_init()
     7          via atexit handler on error condition
     8        * sh_suidchk.c, sh_calls.c, sh_calls.h: need a nosub version of lstat()
     9          to use with relative path after chdir()
     10        * samhain.c, sh_calls.c, sh_calls.h: only run (l)stat() in subprocess
     11          after reading config file (to allow disabling)
     12        * sh_unix.c: run sh_sub_kill() in parent after forking the daemon
    213        * fix zeroing of result from getnameinfo() (problem reported by Richard)
    314        * fix spurious warnings about unsupported address family (reported
  • trunk/include/sh_sub.h

    r316 r321  
    22#define SH_SUB_H
    33
     4void sh_kill_sub ();
    45int sh_sub_stat  (const char *path, struct stat *buf);
    56int sh_sub_lstat (const char *path, struct stat *buf);
  • trunk/init/samhain.startGentoo.in

    r1 r321  
    99start() {
    1010        ebegin "Starting @install_name@"
     11        @sh_insmod_pre@
    1112        /sbin/start-stop-daemon --start --quiet  --exec @sbindir@/@install_name@
    1213        eend $?
  • trunk/init/samhain.startLSB.in

    r279 r321  
    8787case "$1" in
    8888  start)
     89        #
     90        # Preloaded kernel module
     91        #
     92        @sh_insmod_pre@
     93        #
    8994        ${DAEMON} start
    9095        ERRNUM=$?
  • trunk/init/samhain.startLinux.in

    r59 r321  
    140140        fi
    141141        #
     142        # Preloaded kernel module
     143        #
     144        @sh_insmod_pre@
     145        #
    142146        case "$DISTRO" in
    143147        debian)
  • trunk/src/sh_extern.c

    r294 r321  
    569569  char  infomsg[256];
    570570
     571#ifdef WCONTINUED
     572      int wflags = WNOHANG|WUNTRACED|WCONTINUED;
     573#else
     574      int wflags = WNOHANG|WUNTRACED;
     575#endif
     576
    571577  SL_ENTER(_("sh_ext_pclose"));
    572578
     
    586592
    587593    nochmal:
    588       retval = waitpid(task->pid, &(task->exit_status), WNOHANG|WUNTRACED);
     594      retval = waitpid(task->pid, &(task->exit_status), wflags);
    589595      /*@-bufferoverflowhigh@*/
    590596      if (task->pid == retval)
     
    614620              (void) aud_kill (FIL__, __LINE__, task->pid, 9);
    615621              (void) retry_msleep (0, 30);
    616               (void) waitpid (task->pid, NULL, WNOHANG|WUNTRACED);
     622              (void) waitpid (task->pid, NULL, wflags);
    617623            }
    618624          else
  • trunk/src/sh_ipvx.c

    r314 r321  
    5252static int sh_ipvx_is_ipv6 (const char * addr)
    5353{
    54   int j;
     54  int j, k = 0;
    5555  char c;
    5656  int len = sl_strlen(addr);
     
    6363        ( c != ':') && ( c != '.'))
    6464      return (1 == 0);
     65    else if (c == ':')
     66      ++k;
     67    else if (c == '.' && k < 3)
     68      return (1 == 0); /* ::ffff:ipv4 */
    6569  }
    6670  return (1 == 1);
     
    234238    }
    235239#else
    236   port = ntohs(((struct sockaddr_in *)sa).sin_port);
     240  (void) sa_family;
     241  port = ntohs(((struct sockaddr_in *)sa)->sin_port);
    237242#endif
    238243  return port;
  • trunk/src/sh_kern.c

    r303 r321  
    746746  int  errcode;
    747747
     748#ifdef WCONTINUED
     749      int wflags = WNOHANG|WUNTRACED|WCONTINUED;
     750#else
     751      int wflags = WNOHANG|WUNTRACED;
     752#endif
     753
    748754  /* Close reading side of pipe, and wait some milliseconds
    749755   */
     
    820826
    821827  if (status < 0)
    822     res = waitpid(mpid, NULL,    WNOHANG|WUNTRACED);
     828    res = waitpid(mpid, NULL,    wflags);
    823829  else
    824830    {
    825       res = waitpid(mpid, &status, WNOHANG|WUNTRACED);
     831      res = waitpid(mpid, &status, wflags);
    826832      if (res == 0 && 0 != WIFEXITED(status))
    827833        status = WEXITSTATUS(status);
  • trunk/src/sh_sub.c

    r316 r321  
    2020#include "config_xor.h"
    2121
     22/* 0->1 for debug */
     23#if 0
     24#define SH_SUB_DBG 1
     25#endif
     26
    2227#ifndef NULL
    2328#if !defined(__cplusplus)
     
    6267static ssize_t sh_sub_read(int fd, void *buf, size_t count);
    6368
    64 static void sh_kill_sub()
     69void sh_kill_sub()
    6570{
    6671  SH_MUTEX_LOCK(mutex_sub);
     72
    6773  if (sh_child_pid != -1)
    6874    {
    6975      int status;
     76#ifdef WCONTINUED
     77      int wflags = WNOHANG|WUNTRACED|WCONTINUED;
     78#else
     79      int wflags = WNOHANG|WUNTRACED;
     80#endif
    7081
    7182      close (parent2child[1]);
    7283      close (child2parent[0]);
    7384
    74       fprintf(stderr, "FIXME kill_sub %d\n", (int) sh_child_pid);
     85      /* fprintf(stderr, "FIXME kill_sub %d\n", (int) sh_child_pid); */
    7586
    7687      /* Let's be rude. */
     
    8091
    8192      if (sh_wait_ret == 0)
    82         sh_wait_ret = waitpid(          -1, &status, WNOHANG|WUNTRACED);
     93        sh_wait_ret = waitpid(          -1, &status, wflags);
    8394      else
    84         sh_wait_ret = waitpid(sh_child_pid, &status, WNOHANG|WUNTRACED);
     95        sh_wait_ret = waitpid(sh_child_pid, &status, wflags);
    8596
    8697      sh_child_pid = -1;
    8798    }
     99
    88100  SH_MUTEX_UNLOCK(mutex_sub);
    89101  return;
     
    93105{
    94106  pid_t res;
    95   int   retval = 0;
     107  volatile int   retval = 0;
    96108
    97109  SH_MUTEX_LOCK(mutex_sub);
     
    162174              ++fd;
    163175            }
     176
     177          /*
     178          for (i = 0; i < 3; ++i)
     179            {
     180              if ( fcntl(i, F_GETFL, 0) == (-1))
     181                (void) open(_("/dev/null"), O_RDWR, 0);
     182            }
     183          */
    164184
    165185          /* reset signal handling
     
    275295  do {
    276296
    277     // fprintf(stderr, "FIXME wait_com polling..\n");
     297    /* fprintf(stderr, "FIXME wait_com polling..\n"); */
    278298
    279299    do {
     
    307327            outbuf.errnum = errno;
    308328
    309             // fprintf(stderr, "FIXME wait_com writing..\n");
     329            /* fprintf(stderr, "FIXME wait_com writing..\n"); */
    310330
    311331            ret = sh_sub_write(child2parent[1], &outbuf, sizeof(outbuf));
    312332            if (ret < 0)
    313333              {
    314                 fprintf(stderr, "FIXME wait_com return 1\n");
     334                /* fprintf(stderr, "FIXME wait_com return 1\n"); */
    315335                return;
    316336              }
     
    318338        else /* sh_sub_read() < 0 */
    319339          {
    320             fprintf(stderr, "FIXME wait_com return 2\n");
     340            /* fprintf(stderr, "FIXME wait_com return 2\n"); */
    321341            return;
    322342          }
    323343      }
    324344   
    325     // fprintf(stderr, "FIXME wait_com next..\n");
     345    /* fprintf(stderr, "FIXME wait_com next..\n"); */
    326346
    327347  } while (1 == 1);
     
    362382}
    363383
     384#ifdef SH_SUB_DBG
     385#include <stdarg.h>
     386static void debug_it (const char *fmt, ...)
     387{
     388  char msg[256];
     389  va_list ap;
     390
     391  int fd = open("debug.it", O_CREAT|O_WRONLY|O_APPEND, 0666);
     392
     393  va_start(ap, fmt);
     394  vsnprintf(msg, sizeof(msg), fmt, ap);  /* flawfinder: ignore */
     395  va_end(ap);
     396
     397  write(fd, msg, strlen(msg));
     398  write(fd, "\n", 1);
     399  close(fd);
     400  return;
     401}
     402#endif
     403
    364404static int sh_sub_stat_int(const char *path, struct stat *buf, char command)
    365405{
     
    397437 start:
    398438
     439#ifdef SH_SUB_DBG
     440  debug_it("%d sh_child_pid %d\n", (int)getpid(), (int) sh_child_pid);
     441#endif
     442
    399443  if (sh_child_pid == -1)
    400444    sh_create_sub();
    401445
    402   // fprintf(stderr, "FIXME stat_sub %s\n", inbuf.path);
     446#ifdef SH_SUB_DBG
     447  debug_it("%d stat_sub %s (%d)\n", (int)getpid(), inbuf.path, (int) sh_child_pid);
     448#endif
    403449
    404450  SH_MUTEX_LOCK(mutex_sub_work);
     
    412458    }
    413459
    414   // fprintf(stderr, "FIXME stat_sub polling..\n");
     460#ifdef SH_SUB_DBG
     461  debug_it("%d stat_sub polling..\n", (int)getpid());
     462#endif
    415463
    416464  pfds.fd     = child2parent[0];
     
    428476    }
    429477
    430   // fprintf(stderr, "FIXME stat_sub reading..\n");
     478#ifdef SH_SUB_DBG
     479  debug_it("%d stat_sub reading..\n", (int)getpid());
     480#endif
    431481
    432482  retval = sh_sub_read (child2parent[0], &outbuf, sizeof(outbuf));
     
    444494  if      (sflag == 0)
    445495    {
    446       // fprintf(stderr, "FIXME stat_sub done..\n");
     496#ifdef SH_SUB_DBG
     497      debug_it("%d stat_sub done..\n", (int)getpid());
     498#endif
    447499      memcpy(buf, &(outbuf.sbuf), sizeof(struct stat));
    448500      errno = outbuf.errnum;
     
    451503  else if (sflag == 1)
    452504    {
     505#ifdef SH_SUB_DBG
     506      debug_it("%d stat_sub error..\n", (int)getpid());
     507#endif
    453508      /* could not read, thus subprocess may have gone */
     509      sflag = 0;
    454510      goto start;
    455511    }
  • trunk/src/sh_unix.c

    r315 r321  
    19091909  char errbuf[SH_ERRBUF_SIZE];
    19101910
     1911  extern void sh_kill_sub();
     1912
    19111913  SL_ENTER(_("sh_unix_init"));
    19121914
     
    19181920    case 0:  break;                             /* child process continues */
    19191921    case -1: SL_RETURN((-1),_("sh_unix_init")); /* error                   */
    1920     default: aud__exit(FIL__, __LINE__, 0);     /* parent process exits    */
     1922    default:                                    /* parent process exits    */
     1923      sh_kill_sub();
     1924      aud__exit(FIL__, __LINE__, 0);
    19211925    }
    19221926
     
    19321936    case 0:  break;                             /* child process continues */
    19331937    case -1: SL_RETURN((-1),_("sh_unix_init")); /* error                   */
    1934     default: aud__exit(FIL__, __LINE__, 0);     /* parent process exits    */
     1938    default:                                    /* parent process exits    */
     1939      sh_kill_sub();
     1940      aud__exit(FIL__, __LINE__, 0);
    19351941    }
    19361942
  • trunk/test/testrun_1c.sh

    r115 r321  
    340340                $MAKE  'DBGDEF=-DSH_SUIDTESTDIR=\"${BASE}\"' >/dev/null 2>&1
    341341                if test x$? = x0; then
    342                     [ -z "$verbose" ] || log_msg_ok "make...";
     342                    [ -z "$verbose" ] || log_msg_ok "make DBGDEF=-DSH_SUIDTESTDIR=${BASE} ...";
    343343                else
    344344                    [ -z "$quiet" ] &&   log_msg_fail "make...";
Note: See TracChangeset for help on using the changeset viewer.