Changeset 143


Ignore:
Timestamp:
Oct 31, 2007, 1:09:26 AM (11 years ago)
Author:
rainer
Message:

Bugfixes and threaded process check.

Location:
trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/Makefile.in

    r140 r143  
    16531653sh_forward.o: $(srcsrc)/sh_forward.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_tiger.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_forward.h $(srcinc)/sh_srp.h $(srcinc)/sh_fifo.h $(srcinc)/sh_tools.h $(srcinc)/sh_entropy.h $(srcinc)/sh_html.h $(srcinc)/sh_mail.h $(srcinc)/sh_socket.h $(srcinc)/sh_static.h $(srcinc)/rijndael-api-fst.h $(srcinc)/sh_readconf.h $(srcinc)/zAVLTree.h $(srcinc)/sh_extern.h  
    16541654sh_modules.o: $(srcsrc)/sh_modules.c Makefile config_xor.h $(srcinc)/sh_modules.h $(srcinc)/sh_pthread.h $(srcinc)/sh_utmp.h $(srcinc)/sh_mounts.h $(srcinc)/sh_userfiles.h $(srcinc)/sh_kern.h $(srcinc)/sh_suidchk.h $(srcinc)/sh_processcheck.h $(srcinc)/sh_portcheck.h  
    1655 sh_utmp.o: $(srcsrc)/sh_utmp.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_utmp.h  
     1655sh_utmp.o: $(srcsrc)/sh_utmp.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_utmp.h $(srcinc)/sh_pthread.h  
    16561656sh_kern.o: $(srcsrc)/sh_kern.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_kern.h sh_ks_xor.h $(srcinc)/sh_unix.h $(srcinc)/sh_hash.h  
    16571657sh_suidchk.o: $(srcsrc)/sh_suidchk.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_suidchk.h $(srcinc)/sh_hash.h $(srcinc)/sh_unix.h $(srcinc)/sh_files.h $(srcinc)/sh_schedule.h $(srcinc)/sh_calls.h  
     
    16951695sh_prelude_old.o: $(srcsrc)/sh_prelude_old.c Makefile config_xor.h $(srcinc)/slib.h $(srcinc)/sh_mem.h $(srcinc)/sh_cat.h $(srcinc)/sh_error_min.h $(srcinc)/sh_prelude.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h  
    16961696sh_async.o: $(srcsrc)/sh_async.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_calls.h $(srcinc)/sh_error.h  
    1697 sh_processcheck.o: $(srcsrc)/sh_processcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_modules.h $(srcinc)/sh_processcheck.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_extern.h $(srcinc)/sh_calls.h $(srcinc)/CuTest.h  
     1697sh_processcheck.o: $(srcsrc)/sh_processcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_modules.h $(srcinc)/sh_processcheck.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_extern.h $(srcinc)/sh_calls.h $(srcinc)/sh_pthread.h $(srcinc)/CuTest.h  
    16981698sh_portcheck.o: $(srcsrc)/sh_portcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_mem.h $(srcinc)/sh_calls.h $(srcinc)/sh_utils.h $(srcinc)/sh_modules.h $(srcinc)/sh_pthread.h $(srcinc)/CuTest.h  
    1699 sh_pthread.o: $(srcsrc)/sh_pthread.c Makefile config_xor.h $(srcinc)/sh_pthread.h $(srcinc)/sh_modules.h $(srcinc)/sh_calls.h  
     1699sh_pthread.o: $(srcsrc)/sh_pthread.c Makefile config_xor.h $(srcinc)/sh_pthread.h $(srcinc)/sh_calls.h $(srcinc)/sh_modules.h  
  • trunk/configure.ac

    r138 r143  
    1313dnl start 
    1414dnl 
    15 AM_INIT_AUTOMAKE(samhain, 2.3.7) 
     15AM_INIT_AUTOMAKE(samhain, 2.4.0) 
    1616AC_CANONICAL_HOST 
    1717 
  • trunk/depend.dep

    r140 r143  
    1919sh_forward.o: $(srcsrc)/sh_forward.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_tiger.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_forward.h $(srcinc)/sh_srp.h $(srcinc)/sh_fifo.h $(srcinc)/sh_tools.h $(srcinc)/sh_entropy.h $(srcinc)/sh_html.h $(srcinc)/sh_mail.h $(srcinc)/sh_socket.h $(srcinc)/sh_static.h $(srcinc)/rijndael-api-fst.h $(srcinc)/sh_readconf.h $(srcinc)/zAVLTree.h $(srcinc)/sh_extern.h  
    2020sh_modules.o: $(srcsrc)/sh_modules.c Makefile config_xor.h $(srcinc)/sh_modules.h $(srcinc)/sh_pthread.h $(srcinc)/sh_utmp.h $(srcinc)/sh_mounts.h $(srcinc)/sh_userfiles.h $(srcinc)/sh_kern.h $(srcinc)/sh_suidchk.h $(srcinc)/sh_processcheck.h $(srcinc)/sh_portcheck.h  
    21 sh_utmp.o: $(srcsrc)/sh_utmp.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_utmp.h  
     21sh_utmp.o: $(srcsrc)/sh_utmp.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_utmp.h $(srcinc)/sh_pthread.h  
    2222sh_kern.o: $(srcsrc)/sh_kern.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_kern.h sh_ks_xor.h $(srcinc)/sh_unix.h $(srcinc)/sh_hash.h  
    2323sh_suidchk.o: $(srcsrc)/sh_suidchk.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_suidchk.h $(srcinc)/sh_hash.h $(srcinc)/sh_unix.h $(srcinc)/sh_files.h $(srcinc)/sh_schedule.h $(srcinc)/sh_calls.h  
     
    6161kern_head.o: $(srcsrc)/kern_head.c Makefile config.h $(srcinc)/kern_head.h $(srcinc)/kern_head.h  
    6262sh_async.o: $(srcsrc)/sh_async.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_calls.h $(srcinc)/sh_error.h  
    63 sh_processcheck.o: $(srcsrc)/sh_processcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_modules.h $(srcinc)/sh_processcheck.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_extern.h $(srcinc)/sh_calls.h $(srcinc)/CuTest.h  
     63sh_processcheck.o: $(srcsrc)/sh_processcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_modules.h $(srcinc)/sh_processcheck.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_extern.h $(srcinc)/sh_calls.h $(srcinc)/sh_pthread.h $(srcinc)/CuTest.h  
    6464sh_portcheck.o: $(srcsrc)/sh_portcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_mem.h $(srcinc)/sh_calls.h $(srcinc)/sh_utils.h $(srcinc)/sh_modules.h $(srcinc)/sh_pthread.h $(srcinc)/CuTest.h  
    65 sh_pthread.o: $(srcsrc)/sh_pthread.c Makefile config_xor.h $(srcinc)/sh_pthread.h $(srcinc)/sh_modules.h $(srcinc)/sh_calls.h  
     65sh_pthread.o: $(srcsrc)/sh_pthread.c Makefile config_xor.h $(srcinc)/sh_pthread.h $(srcinc)/sh_calls.h $(srcinc)/sh_modules.h  
  • trunk/depend.sum

    r140 r143  
    1 836204565 
     12519500817 
  • trunk/include/samhain.h

    r140 r143  
    128128}; 
    129129 
    130 enum { 
    131   SH_MOD_ACTIVE    = 0,  
    132   SH_MOD_THREAD    = 1, 
    133   SH_MOD_FAILED    = 2 
    134 }; 
    135  
     130#define SH_MOD_THREAD  1 
     131#define SH_MOD_ACTIVE  0 
     132#define SH_MOD_FAILED -1 
     133  
    136134/* Flags for file status 
    137135 */ 
     
    287285extern volatile  int      sig_debug_switch;       /* SIGUSR1 */ 
    288286extern volatile  int      sig_suspend_switch;     /* SIGUSR2 */ 
    289 extern volatile  int      sh_global_suspend_flag; /* SIGUSR2 */ 
     287extern volatile  int      sh_global_suspend_flag; 
    290288extern volatile  int      sig_fresh_trail;        /* SIGIOT  */ 
     289extern volatile  int      sh_thread_pause_flag; 
    291290extern volatile  int      sig_config_read_again;  /* SIGHUP  */ 
    292291extern volatile  int      sig_terminate;          /* SIGQUIT */ 
  • trunk/include/sh_pthread.h

    r140 r143  
    3838#if defined(HAVE_PTHREAD_MUTEX_RECURSIVE) 
    3939 
    40 /* On GNU C, it's an enum, thus the alternative implementation  
    41  * below is used. 
    42  */ 
    4340#define SH_MUTEX_RECURSIVE(M)                                          \ 
    4441static pthread_mutex_t M;                                              \ 
     
    4643{                                                                      \ 
    4744  pthread_mutexattr_t   mta;                                           \ 
     45  pthread_mutexattr_init(&mta);                                        \ 
    4846  pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE);            \ 
    4947  pthread_mutex_init(&(M), &mta);                                      \ 
     
    115113SH_MUTEX_EXTERN(mutex_pwent); 
    116114SH_MUTEX_EXTERN(mutex_readdir); 
     115/* Prevent threads from logging while we are in suspend */ 
     116SH_MUTEX_EXTERN(mutex_thread_nolog); 
    117117 
    118118/* 
     
    120120 */ 
    121121extern int sh_g_thread(); 
     122 
     123 
     124/* 
     125 * ----   Functions for threaded modules   ---- 
     126 */ 
     127int sh_pthread_create(void *(*start_routine)(void*), void *arg); 
     128int sh_pthread_cancel_all(void); 
     129void sh_threaded_module_reconf(void *arg); 
     130void * sh_threaded_module_run(void *arg); 
    122131 
    123132#else 
  • trunk/src/samhain.c

    r142 r143  
    114114volatile  int      sh_global_suspend_flag; 
    115115volatile  int      sig_fresh_trail;        /* SIGIOT  */ 
     116volatile  int      sh_thread_pause_flag = S_FALSE; 
    116117volatile  int      sig_config_read_again;  /* SIGHUP  */ 
    117118volatile  int      sig_terminate;          /* SIGQUIT */ 
     
    17241725              sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_RECONF); 
    17251726 
     1727              sh_thread_pause_flag = S_TRUE; 
     1728 
    17261729#if defined(WITH_EXTERNAL) 
    17271730              /* delete list of external tasks 
     
    17931796                  sh.flag.loop     = S_FALSE; 
    17941797                } 
     1798 
     1799              sh_thread_pause_flag = S_FALSE; 
    17951800 
    17961801              /* --- Initialize modules. --- 
     
    18291834          if (sig_fresh_trail == 1) /* SIGIOT */ 
    18301835            { 
    1831               /* Logfile access  
    1832                */ 
     1836              if (sh_global_suspend_flag == 0) 
     1837                { 
     1838                  SH_MUTEX_LOCK(mutex_thread_nolog); 
     1839 
     1840                  /* Logfile access  
     1841                   */ 
    18331842#ifdef SH_USE_XML 
    1834               (void) sh_log_file (NULL, NULL); 
    1835 #endif 
    1836               TPT((0, FIL__, __LINE__, _("msg=<Logfile stop/restart.>\n"))); 
    1837               sh_error_only_stderr (S_TRUE); 
    1838               (void) sh_unix_rm_lock_file(sh.srvlog.name); 
    1839               (void) retry_msleep(3, 0); 
    1840               sh.flag.log_start = S_TRUE; 
    1841               sh_error_only_stderr (S_FALSE); 
    1842               sig_fresh_trail       = 0; 
    1843               --sig_raised; 
     1843                  (void) sh_log_file (NULL, NULL); 
     1844#endif 
     1845                  TPT((0, FIL__, __LINE__, _("msg=<Logfile stop/restart.>\n"))); 
     1846                  sh_error_only_stderr (S_TRUE); 
     1847                  (void) sh_unix_rm_lock_file(sh.srvlog.name); 
     1848                  (void) retry_msleep(3, 0); 
     1849                  sh.flag.log_start = S_TRUE; 
     1850                  sh_error_only_stderr (S_FALSE); 
     1851                  sh_thread_pause_flag = S_FALSE; 
     1852                  sig_fresh_trail       = 0; 
     1853                  --sig_raised; 
     1854                  SH_MUTEX_UNLOCK(mutex_thread_nolog); 
     1855                } 
    18441856            } 
    18451857           
     
    18631875            { 
    18641876              TPT((0, FIL__, __LINE__, _("msg=<Suspend switch.>\n"))); 
    1865               if (sh_global_suspend_flag == 1) { 
    1866                 sh_global_suspend_flag = 0; 
    1867               } else { 
     1877              if (sh_global_suspend_flag != 1) { 
     1878                SH_MUTEX_LOCK_UNSAFE(mutex_thread_nolog); 
     1879                sh_global_suspend_flag = 1; 
    18681880                sh_error_handle((-1), FIL__, __LINE__, 0, MSG_SUSPEND,  
    18691881                                sh.prg_name); 
    1870                 sh_global_suspend_flag = 1; 
     1882              } else { 
     1883                sh_global_suspend_flag = 0; 
     1884                SH_MUTEX_UNLOCK_UNSAFE(mutex_thread_nolog); 
    18711885              } 
    18721886              --sig_suspend_switch; 
  • trunk/src/sh_kern.c

    r140 r143  
    968968  if (df) 
    969969    { 
    970       SH_MUTEX_LOCK(mutex_readdir); 
    971  
    972       while (NULL != (entry = readdir(df))) 
     970      while (1) 
    973971        { 
     972          SH_MUTEX_LOCK(mutex_readdir); 
     973          entry = readdir(df); 
     974          SH_MUTEX_UNLOCK(mutex_readdir); 
     975 
     976          if (entry == NULL) 
     977            break; 
     978 
    974979          if (0 == strcmp(entry->d_name, ".") &&  
    975980              0 == strcmp(entry->d_name, "..")) 
     
    981986          SH_FREE(pcipath); 
    982987        } 
    983  
    984       SH_MUTEX_UNLOCK(mutex_readdir); 
    985988 
    986989      closedir(df); 
  • trunk/src/sh_mem.c

    r140 r143  
    108108 
    109109#ifdef HAVE_PTHREAD 
    110  
    111110SH_MUTEX_RECURSIVE(mutex_mem); 
    112  
    113 #else 
    114 #define MEM_MUTEX_INIT ((void)0) 
    115111#endif 
    116112 
  • trunk/src/sh_processcheck.c

    r140 r143  
    6464#include "sh_extern.h" 
    6565#include "sh_calls.h" 
     66#include "sh_pthread.h" 
    6667 
    6768#ifdef SH_USE_PROCESSCHECK 
     
    7071 
    7172#ifdef __linux__ 
    72 #define HAVE_THREADS 
     73#define PS_THREADS 
    7374#endif 
    7475 
     
    7677 */ 
    7778#if defined (SH_WITH_CLIENT) || defined (SH_STANDALONE) 
     79 
     80SH_MUTEX_STATIC(mutex_proc_check, PTHREAD_MUTEX_INITIALIZER); 
    7881 
    7982/* sh_prochk_maxpid is one more than the largest pid 
     
    405408          if (S_FALSE == is_in_list(&list_missing, list->str, 0)) 
    406409            { 
     410              SH_MUTEX_LOCK(mutex_thread_nolog); 
    407411              sh_error_handle(sh_prochk_severity, FIL__, __LINE__, 0,  
    408412                              MSG_PCK_MISS, 
    409413                              list->str); 
     414              SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    410415            } 
    411416        } 
     
    424429                { 
    425430                  tmp = sh_util_safe_name (list->str); 
     431                  SH_MUTEX_LOCK(mutex_thread_nolog); 
    426432                  sh_error_handle(sh_prochk_severity, FIL__, __LINE__, 0,  
    427433                                  MSG_PCK_MISS,  
    428434                                  tmp); 
     435                  SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    429436                  SH_FREE(tmp); 
    430437                } 
     
    458465    { 
    459466      regerror(status, &(new->preg), errbuf, sizeof(errbuf)); 
     467      SH_MUTEX_LOCK(mutex_thread_nolog); 
    460468      sh_error_handle((-1), FIL__, __LINE__, status, MSG_E_SUBGEN,  
    461                       errbuf, _("sh_processes_runps")); 
     469                      errbuf, _("sh_processes_add_process")); 
     470      SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    462471      SH_FREE(new->str); 
    463472      SH_FREE(new); 
     
    578587  if (val <= 0) 
    579588    { 
     589      SH_MUTEX_LOCK(mutex_thread_nolog); 
    580590      sh_error_handle ((-1), FIL__, __LINE__, EINVAL, MSG_EINVALS, 
    581591                       _("process check interval"), c); 
     592      SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    582593      retval = -1; 
    583594    } 
     
    826837              char errbuf[SH_ERRBUF_SIZE]; 
    827838 
     839              /* SH_MUTEX_LOCK(mutex_thread_nolog) is in caller */ 
    828840              sh_error_handle(SH_ERR_ALL, FIL__, __LINE__, errno, MSG_E_SUBGEN, 
    829841                              sh_error_message(errno, errbuf, sizeof(errbuf)), 
     
    848860              if (flag_err_debug == SL_TRUE) 
    849861                { 
    850                   sh_error_handle(SH_ERR_ALL, FIL__, __LINE__, num, MSG_E_SUBGEN, 
     862                  /* SH_MUTEX_LOCK(mutex_thread_nolog) is in caller */ 
     863                  sh_error_handle(SH_ERR_ALL, FIL__, __LINE__, num,  
     864                                  MSG_E_SUBGEN, 
    851865                                  tstr, 
    852866                                  _("sh_processes_readps")); 
     
    880894          else if (isspace(cc)) 
    881895            { 
    882 #ifdef HAVE_THREADS 
     896#ifdef PS_THREADS 
    883897              num  = 0; 
    884898              line = SKIP_WS2; 
     
    979993  if (!sh_prochk_psarg) 
    980994    { 
    981 #ifdef HAVE_THREADS 
     995#ifdef PS_THREADS 
    982996      (void) sh_ext_tas_add_argv(&task,  _("-eT")); 
    983997#else 
     
    9961010  if (status != 0) 
    9971011    { 
     1012      /* SH_MUTEX_LOCK(mutex_thread_nolog) is in caller */ 
    9981013      sh_error_handle(SH_ERR_ALL, FIL__, __LINE__, status, MSG_E_SUBGEN,  
    9991014                      _("Could not open pipe"), _("sh_processes_runps")); 
     
    10371052  if (!res) 
    10381053    { 
     1054      SH_MUTEX_LOCK(mutex_thread_nolog); 
    10391055      sh_error_handle((-1), FIL__, __LINE__, 0, MSG_E_SUBGEN,  
    10401056                      _("Internal error: NULL argument"),  
    10411057                      _("sh_process_check_int")); 
     1058      SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    10421059      SL_RETURN ((-1), _("sh_process_check_int")); 
    10431060    } 
    10441061 
     1062  SH_MUTEX_LOCK(mutex_thread_nolog); 
    10451063  sh_processes_runps (res, NULL, 0, SH_PR_PS, 0); 
     1064  SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    10461065  for (i = sh_prochk_minpid; i != sh_prochk_maxpid; ++i) 
    10471066    { 
     
    10491068      res[j] = sh_processes_check ((pid_t) i, res[j]); 
    10501069    } 
     1070  SH_MUTEX_LOCK(mutex_thread_nolog); 
    10511071  sh_processes_runps (res, NULL, 0, SH_PR_PS2, 0); 
     1072  SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    10521073 
    10531074  /* Evaluate results 
     
    10841105          if ((res[j] & SH_PR_PS_ANY) && (res[j] & SH_PR_ANY)) 
    10851106            { 
     1107              SH_MUTEX_LOCK(mutex_thread_nolog); 
    10861108              sh_error_handle((-1), FIL__, __LINE__, 0, MSG_PCK_OK,  
    10871109                              (unsigned long) i, tests); 
     1110              SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    10881111            } 
    10891112 
     
    11051128                      char * safe; 
    11061129 
     1130                      SH_MUTEX_LOCK(mutex_thread_nolog); 
    11071131                      aout = get_user_and_path ((pid_t) i, user, sizeof(user)); 
     1132                      SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    11081133 
    11091134                      if (aout) 
    11101135                        { 
    11111136                          safe = sh_util_safe_name (aout); 
     1137                          SH_MUTEX_LOCK(mutex_thread_nolog); 
    11121138                          sh_error_handle(sh_prochk_severity, FIL__, __LINE__, 0,  
    11131139                                          MSG_PCK_P_HIDDEN, 
    11141140                                          (unsigned long) i, tests, safe, user); 
     1141                          SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    11151142                          SH_FREE(safe); 
    11161143                          SH_FREE(aout); 
    11171144                        } 
    11181145                      else 
    1119                         sh_error_handle(sh_prochk_severity, FIL__, __LINE__, 0,  
    1120                                         MSG_PCK_HIDDEN, 
    1121                                         (unsigned long) i, tests); 
    1122                          
     1146                        { 
     1147                          SH_MUTEX_LOCK(mutex_thread_nolog); 
     1148                          sh_error_handle(sh_prochk_severity, FIL__, __LINE__, 0,  
     1149                                          MSG_PCK_HIDDEN, 
     1150                                          (unsigned long) i, tests); 
     1151                          SH_MUTEX_UNLOCK(mutex_thread_nolog); 
     1152                        } 
    11231153                    } 
    11241154                } 
     
    11341164                  if (S_FALSE == is_in_list(&list_fake, NULL, i)) 
    11351165                    { 
     1166                      SH_MUTEX_LOCK(mutex_thread_nolog); 
    11361167                      sh_error_handle(sh_prochk_severity, FIL__, __LINE__, 0,  
    11371168                                      MSG_PCK_FAKE,  
    11381169                                      (unsigned long) i, tests); 
     1170                      SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    11391171                    } 
    11401172                } 
     
    11501182/* Initialise.  
    11511183 */ 
    1152 int sh_prochk_init(struct mod_type * arg)  
    1153 { 
    1154   (void) arg; 
     1184static int sh_prochk_init_internal()  
     1185{ 
    11551186  SL_ENTER(_("sh_prochk_init")); 
    11561187 
     
    11791210} 
    11801211 
     1212int sh_prochk_init (struct mod_type * arg) 
     1213{ 
     1214  if (ShProchkActive == S_FALSE) 
     1215    return SH_MOD_FAILED; 
     1216#ifdef HAVE_PTHREAD 
     1217  if (arg != NULL && arg->initval < 0 && sh.flag.isdaemon == S_TRUE) 
     1218    { 
     1219      if (0 == sh_pthread_create(sh_threaded_module_run, (void *)arg)) 
     1220        return SH_MOD_THREAD; 
     1221      else 
     1222        return SH_MOD_FAILED; 
     1223    } 
     1224#endif 
     1225  return sh_prochk_init_internal(); 
     1226} 
    11811227 
    11821228int sh_prochk_timer(time_t tcurrent)  
     
    11991245  SL_ENTER(_("sh_prochk_check")); 
    12001246 
     1247  SH_MUTEX_LOCK(mutex_proc_check); 
    12011248  if( ShProchkActive != S_FALSE ) 
    12021249    { 
     1250      SH_MUTEX_LOCK(mutex_thread_nolog); 
    12031251      sh_error_handle((-1), FIL__, __LINE__, 0, MSG_PCK_CHECK,  
    12041252                      (unsigned long) sh_prochk_minpid,  
    12051253                      (unsigned long) (sh_prochk_maxpid-1)); 
     1254      SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    12061255 
    12071256      if (sh_prochk_res) { 
     
    12201269      clean_list (&list_fake); 
    12211270    } 
     1271  SH_MUTEX_UNLOCK(mutex_proc_check); 
    12221272 
    12231273  SL_RETURN(status, _("sh_prochk_check")); 
     
    12541304  SL_ENTER(_("sh_prochk_reconf")); 
    12551305 
     1306  SH_MUTEX_LOCK(mutex_proc_check); 
    12561307  userdef_maxpid     = 0; 
    12571308  sh_prochk_maxpid   = 0x8000; 
     
    12711322    SH_FREE(sh_prochk_pspath); 
    12721323  sh_prochk_pspath = NULL; 
     1324  SH_MUTEX_UNLOCK(mutex_proc_check); 
    12731325 
    12741326  SL_RETURN(0, _("sh_prochk_reconf")); 
  • trunk/src/sh_pthread.c

    r142 r143  
    88#include "sh_calls.h" 
    99#include "sh_modules.h" 
    10  
    11 SH_MUTEX_INIT(mutex_skey,   PTHREAD_MUTEX_INITIALIZER); 
    12 SH_MUTEX_INIT(mutex_resolv, PTHREAD_MUTEX_INITIALIZER); 
    13 SH_MUTEX_INIT(mutex_pwent,  PTHREAD_MUTEX_INITIALIZER); 
    14 SH_MUTEX_INIT(mutex_readdir,PTHREAD_MUTEX_INITIALIZER); 
     10extern volatile  int      sh_thread_pause_flag; 
     11 
     12SH_MUTEX_INIT(mutex_skey,         PTHREAD_MUTEX_INITIALIZER); 
     13SH_MUTEX_INIT(mutex_resolv,       PTHREAD_MUTEX_INITIALIZER); 
     14SH_MUTEX_INIT(mutex_pwent,        PTHREAD_MUTEX_INITIALIZER); 
     15SH_MUTEX_INIT(mutex_readdir,      PTHREAD_MUTEX_INITIALIZER); 
     16SH_MUTEX_INIT(mutex_thread_nolog, PTHREAD_MUTEX_INITIALIZER); 
    1517 
    1618void sh_pthread_mutex_unlock (void *arg) 
     
    136138/* ---- Utility functions for modules ---- 
    137139 */ 
     140 
     141#undef  S_TRUE 
     142#define S_TRUE    1 
     143#undef  S_FALSE 
     144#define S_FALSE   0 
     145 
    138146void sh_threaded_module_cleanup(void *arg) 
    139147{ 
     
    162170          while (1) 
    163171            { 
    164               if (0 != this_module->mod_timer(time(NULL))) 
     172              if (sh_thread_pause_flag != S_TRUE &&  
     173                  0 != this_module->mod_timer(time(NULL))) 
    165174                { 
    166175                  /* If module has been de-activated on reconfigure, 
     
    172181                    break; 
    173182                  pthread_testcancel(); 
    174                   retry_msleep(1,0); 
    175183                } 
     184              retry_msleep(1,0); 
    176185            } 
    177186 
  • trunk/src/sh_suidchk.c

    r140 r143  
    874874  do { 
    875875 
    876     if (sig_urgent > 0) { 
    877       SL_RETURN( (0), _("sh_suidchk_check_internal")); 
    878     } 
    879  
    880876    thisEntry = readdir (thisDir); 
    881877 
     
    905901    if (!dirlist) 
    906902      break; 
     903 
     904    if (sig_urgent > 0) { 
     905      SL_RETURN( (0), _("sh_suidchk_check_internal")); 
     906    } 
    907907 
    908908    tmpcat = SH_ALLOC(PATH_MAX); 
  • trunk/src/sh_tools.c

    r137 r143  
    522522#endif 
    523523        { 
     524          host_name = NULL; 
     525 
    524526          SH_MUTEX_LOCK(mutex_resolv); 
    525527 
     
    596598                        } 
    597599                    } 
    598  
    599                   SH_FREE(host_name); 
    600600                } 
    601601            } 
    602602          SH_MUTEX_UNLOCK(mutex_resolv); 
     603          if (host_name) SH_FREE(host_name); 
    603604        } 
    604605   
  • trunk/src/sh_unix.c

    r138 r143  
    42214221  if (0 != page_locking) 
    42224222    { 
    4223       SL_RETURN((-1), _("sh_unix_mlock")); 
     4223      status = -1; 
     4224      goto exit_mlock; 
    42244225    } 
    42254226 
     
    42844285          SH_FREE(page_list); 
    42854286          page_locking = 0; 
    4286           SL_RETURN((status), _("sh_unix_mlock")); 
     4287          goto exit_mlock; 
    42874288        } 
    42884289      page_list->next = sh_page_locked; 
     
    42924293    } 
    42934294  page_locking = 0; 
     4295 
     4296 exit_mlock: 
    42944297  SH_MUTEX_UNLOCK_UNSAFE(mutex_mlock); 
    42954298 
     
    43324335  if (0 != page_locking) 
    43334336    { 
    4334       SL_RETURN((-1), _("sh_unix_munlock")); 
     4337      status = -1; 
     4338      goto exit_munlock; 
    43354339    } 
    43364340  page_locking = 1; 
     
    44374441 
    44384442  page_locking = 0; 
     4443 
     4444 exit_munlock: 
    44394445  SH_MUTEX_UNLOCK_UNSAFE(mutex_mlock); 
    4440  
    44414446  SL_RETURN((status), _("sh_unix_munlock")); 
    44424447} 
  • trunk/src/sh_utmp.c

    r142 r143  
    7979#include "sh_modules.h" 
    8080#include "sh_utmp.h" 
    81  
     81#include "sh_pthread.h" 
     82 
     83SH_MUTEX_EXTERN(mutex_thread_nolog); 
    8284 
    8385#ifdef TM_IN_SYS_TIME 
     
    300302  if (sh_utmpfile == NULL)  
    301303    { 
     304      SH_MUTEX_LOCK(mutex_thread_nolog); 
    302305      fd = (int) aud_open (FIL__, __LINE__, SL_NOPRIV,  
    303306                           sh_utmppath, O_RDONLY, 0); 
     307      SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    304308      if (fd >= 0) 
    305309        { 
     
    313317        { 
    314318          error = errno; 
     319          SH_MUTEX_LOCK(mutex_thread_nolog); 
    315320          sh_error_handle ((-1), FIL__, __LINE__, error, MSG_E_ACCESS, 
    316321                           (long) sh.real.uid, sh_utmppath); 
     322          SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    317323          SL_RET0(_("sh_utmp_setutent")); 
    318324        } 
     
    489495    return SH_MOD_FAILED; 
    490496#ifdef HAVE_PTHREAD 
    491   if (arg != NULL && arg->initval < 0) 
     497  if (arg != NULL && arg->initval < 0 && sh.flag.isdaemon == S_TRUE) 
    492498    { 
    493499      if (0 == sh_pthread_create(sh_threaded_module_run, (void *)arg)) 
     
    559565  if (ShUtmpActive == BAD) 
    560566    SL_RETURN( (-1), _("sh_utmp_check")); 
     567  SH_MUTEX_LOCK(mutex_thread_nolog); 
    561568  sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_UT_CHECK); 
     569  SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    562570  sh_utmp_check_internal (1); 
    563571 
     
    579587  tmp[0] = '='; tmp[1] = '\0'; 
    580588  (void) sl_strlcat (tmp, c, 32); 
     589  SH_MUTEX_LOCK(mutex_thread_nolog); 
    581590  retval = sh_error_set_level (tmp, &ShUtmpLoginSolo); 
     591  SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    582592  SL_RETURN(retval, _("sh_utmp_set_login_solo")); 
    583593} 
     
    591601  tmp[0] = '='; tmp[1] = '\0'; 
    592602  (void) sl_strlcat (tmp, c, 32); 
     603  SH_MUTEX_LOCK(mutex_thread_nolog); 
    593604  retval = sh_error_set_level (tmp, &ShUtmpLoginMulti); 
     605  SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    594606  SL_RETURN(retval, _("sh_utmp_set_login_multi")); 
    595607} 
     
    603615  tmp[0] = '='; tmp[1] = '\0'; 
    604616  (void) sl_strlcat (tmp, c, 32); 
     617  SH_MUTEX_LOCK(mutex_thread_nolog); 
    605618  retval = sh_error_set_level (tmp, &ShUtmpLogout); 
     619  SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    606620  SL_RETURN(retval, _("sh_utmp_set_logout_good")); 
    607621} 
     
    616630  if (val <= 0) 
    617631    { 
     632      SH_MUTEX_LOCK(mutex_thread_nolog); 
    618633      sh_error_handle ((-1), FIL__, __LINE__, EINVAL, MSG_EINVALS, 
    619634                       _("utmp timer"), c); 
     635      SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    620636      retval = -1; 
    621637    } 
     
    823839          ) { 
    824840        status = sh_utmp_login_a(user->name); 
     841        SH_MUTEX_LOCK(mutex_thread_nolog); 
    825842        (void) sh_unix_time (user->time, ttt, TIM_MAX); 
    826843        sh_error_handle( ShUtmpLoginSolo, FIL__, __LINE__, 0, 
     
    843860                         status 
    844861                         ); 
     862        SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    845863      } else 
    846864        if (0 != sh_utmp_is_virtual(ut->ut_line, user->ut_host)) 
    847865          {        
    848866            status = sh_utmp_login_a(user->name); 
     867            SH_MUTEX_LOCK(mutex_thread_nolog); 
    849868            (void) sh_unix_time (user->time, ttt, TIM_MAX); 
    850869            sh_error_handle( ShUtmpLoginMulti, FIL__, __LINE__, 0, 
     
    867886                             status 
    868887                             ); 
     888            SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    869889          } 
    870890       
     
    882902        { 
    883903          status = sh_utmp_login_r(user->name); 
     904          SH_MUTEX_LOCK(mutex_thread_nolog); 
    884905          (void) sh_unix_time (ut->ut_time, ttt, TIM_MAX); 
    885906          sh_error_handle( ShUtmpLogout, FIL__, __LINE__, 0, 
     
    902923                           status 
    903924                           ); 
     925          SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    904926          userold->next = user->next; 
    905927          if (user == userlist) 
     
    912934        { 
    913935          (void) sl_strlcpy(terminated_line, ut->ut_line, UT_HOSTSIZE); 
     936          SH_MUTEX_LOCK(mutex_thread_nolog); 
    914937          (void) sh_unix_time (ut->ut_time, ttt, TIM_MAX); 
    915938          sh_error_handle( ShUtmpLogout, FIL__, __LINE__, 0, 
     
    918941                           ttt, 0 
    919942                           ); 
     943          SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    920944        } 
    921945      SL_RET0(_("sh_utmp_addlogin")); 
     
    943967      userlist         = user; 
    944968 
     969      SH_MUTEX_LOCK(mutex_thread_nolog); 
    945970      (void) sh_unix_time (user->time, ttt, TIM_MAX); 
    946  
    947  
    948971      sh_error_handle( ShUtmpLoginSolo, FIL__, __LINE__, 0, 
    949972#if defined(HAVE_UTHOST) && defined(HAVE_UTADDR) 
     
    965988                       1 
    966989                       ); 
     990      SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    967991      sh_utmp_login_morechecks(ut); 
    968992    } 
    969993  else  /* probably a logout */ 
    970994    { 
     995      SH_MUTEX_LOCK(mutex_thread_nolog); 
    971996      (void) sh_unix_time (ut->ut_time, ttt, TIM_MAX); 
    972  
    973997      sh_error_handle( ShUtmpLogout, FIL__, __LINE__, 0, 
    974998#if defined(HAVE_UTHOST) && defined(HAVE_UTADDR) 
     
    9901014                       1 
    9911015                       ); 
     1016      SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    9921017      sh_utmp_logout_morechecks(user); 
    9931018      userold->next = user->next; 
     
    10141039  struct SH_UTMP_S * ut; 
    10151040  unsigned long this_read = 0; 
     1041  int           val_retry; 
    10161042 
    10171043  SL_ENTER(_("sh_utmp_check_internal")); 
     
    10191045  /* error if no access 
    10201046   */ 
    1021   if (0 != retry_lstat(FIL__, __LINE__, mode_path[mode], &buf))  
     1047  do { 
     1048    val_retry = /*@-unrecog@*/lstat ( mode_path[mode], &buf)/*@+unrecog@*/; 
     1049  } while (val_retry < 0 && errno == EINTR); 
     1050 
     1051  if (0 != val_retry)  
    10221052    { 
    10231053      error = errno; 
     1054      SH_MUTEX_LOCK(mutex_thread_nolog); 
    10241055      sh_error_handle((-1), FIL__, __LINE__, error, MSG_E_ACCESS, 
    10251056                      (long) sh.real.uid, mode_path[mode]); 
     1057      SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    10261058      SL_RET0(_("sh_utmp_check_internal")); 
    10271059    } 
     
    10431075  if (/*@-usedef@*/buf.st_size < lastsize/*@+usedef@*/ && mode < 2)  
    10441076    {  
     1077      SH_MUTEX_LOCK(mutex_thread_nolog); 
    10451078      sh_error_handle((-1), FIL__, __LINE__, 0, MSG_UT_ROT, 
    10461079                      mode_path[mode]); 
     1080      SH_MUTEX_UNLOCK(mutex_thread_nolog); 
    10471081      lastread = 0; 
    10481082#ifndef USE_SETUTENT 
Note: See TracChangeset for help on using the changeset viewer.