Diff for /freem/src/mumps.c between versions 1.24 and 1.28

version 1.24, 2025/04/16 05:37:06 version 1.28, 2025/05/14 12:22:04
Line 24 Line 24
  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.   *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
  *   *
  *   $Log$   *   $Log$
    *   Revision 1.28  2025/05/14 12:22:04  snw
    *   Further work on shared memory
    *
    *   Revision 1.27  2025/04/17 00:34:04  snw
    *   More logging improvements
    *
    *   Revision 1.26  2025/04/16 17:36:12  snw
    *   Add FreeBSD shm cleanup script
    *
    *   Revision 1.25  2025/04/16 05:57:42  snw
    *   Remove non-useful procctl calls
    *
  *   Revision 1.24  2025/04/16 05:37:06  snw   *   Revision 1.24  2025/04/16 05:37:06  snw
  *   Refine FreeBSD ASLR fix   *   Refine FreeBSD ASLR fix
  *   *
Line 122 Line 134
 #include <pwd.h>  #include <pwd.h>
 #include <grp.h>  #include <grp.h>
 #include "log.h"  #include "log.h"
 #if defined(__FreeBSD__)  
 # include <sys/procctl.h>  
 #endif  
 #if defined(HAVE_GETOPT_H)  #if defined(HAVE_GETOPT_H)
 # include <getopt.h>  # include <getopt.h>
 #endif  #endif
Line 218  int main (int argc, char **argv, char ** Line 227  int main (int argc, char **argv, char **
     strcpy (stack0, argv[0]);      strcpy (stack0, argv[0]);
     stcnv_c2m (stack0);      stcnv_c2m (stack0);
   
 #if defined(__FreeBSD__)  
     int prcdta = PROC_ASLR_FORCE_DISABLE;  
 #endif  
   
     /* strncpy (config_file, SYSCONFDIR"/freem.conf", 100); */      /* strncpy (config_file, SYSCONFDIR"/freem.conf", 100); */
   
   
Line 524  int main (int argc, char **argv, char ** Line 529  int main (int argc, char **argv, char **
     }              }        
 #endif      #endif    
           
       
     if (run_daemon == TRUE) {      if (run_daemon == TRUE) {
         if (geteuid () != 0 && nofork == FALSE) {          if (geteuid () != 0 && nofork == FALSE) {
             logprintf (FM_LOG_FATAL, "freem:  forking daemon must be run as root");              logprintf (FM_LOG_FATAL, "freem:  forking daemon must be run as root");
         }                          }                
     }      }
           
           
     if ((nofork == TRUE) && (run_daemon == FALSE)) {      if ((nofork == TRUE) && (run_daemon == FALSE)) {
         freem_usage ();          freem_usage ();
         exit (1);          exit (1);
Line 598  int main (int argc, char **argv, char ** Line 605  int main (int argc, char **argv, char **
                 }                  }
             }              }
   
               logprintf (FM_LOG_INFO, "environment:  privilege shedding complete");
   
         }          }
         else {          else {
             logprintf (FM_LOG_INFO, "environment:  not running as superuser; not shedding privileges");               logprintf (FM_LOG_INFO, "environment:  not running as superuser; not shedding privileges"); 
         }          }
   
           logprintf (FM_LOG_INFO, "environment:  reopening stdin, stdout, and stderr");
         freopen ("/dev/null", "r", stdin);          freopen ("/dev/null", "r", stdin);
         freopen ("/dev/null", "w+", stdout);          freopen ("/dev/null", "w+", stdout);
         freopen ("/dev/null", "w+", stderr);          freopen ("/dev/null", "w+", stderr);
           logprintf (FM_LOG_INFO, "environment:  stdin, stdout, and stderr reopened");
   
         run_daemon = TRUE;          run_daemon = TRUE;
         nofork = FALSE;                  nofork = FALSE;        
Line 619  int main (int argc, char **argv, char ** Line 630  int main (int argc, char **argv, char **
                           
             snprintf (pid_file_path, PATH_MAX - 1, "%s/freem/run/%s.pid", LOCALSTATEDIR, shm_env);              snprintf (pid_file_path, PATH_MAX - 1, "%s/freem/run/%s.pid", LOCALSTATEDIR, shm_env);
   
               logprintf (FM_LOG_INFO, "environment:  opening pid file %s", pid_file_path);
             pid_fd = open (pid_file_path, O_RDWR | O_CREAT, 0640);              pid_fd = open (pid_file_path, O_RDWR | O_CREAT, 0640);
             errsav = errno;              errsav = errno;
                           
Line 632  int main (int argc, char **argv, char ** Line 644  int main (int argc, char **argv, char **
             }              }
   
             sprintf (pidfile_buf, "%ld\n", (long) getpid ());              sprintf (pidfile_buf, "%ld\n", (long) getpid ());
               logprintf (FM_LOG_INFO, "environment:  writing pid file");
             write (pid_fd, pidfile_buf, strlen (pidfile_buf));              write (pid_fd, pidfile_buf, strlen (pidfile_buf));
   
         }          }
Line 760  int main (int argc, char **argv, char ** Line 773  int main (int argc, char **argv, char **
         else {          else {
             fm_initialized = TRUE;              fm_initialized = TRUE;
         }          }
     }  
   
 #if defined(__FreeBSD__)  
     if ((first_process == FALSE) && (procctl (P_PID, getpid (), PROC_ASLR_CTL, &prcdta) == -1)) {  
         fprintf (stderr, "freem:  could not disable address space layout randomization for pid %ld; program operation may be unreliable [error %s]\n", getpid(), strerror (errno));  
     }          }    
 #endif  
       
   
     if (first_process == TRUE) {      if (first_process == TRUE) {
                   
Line 795  int main (int argc, char **argv, char ** Line 801  int main (int argc, char **argv, char **
   
                 logprintf (FM_LOG_WARNING, "environment:  entering maintenance mode");                  logprintf (FM_LOG_WARNING, "environment:  entering maintenance mode");
                                   
                 for (slot = shm_config->hdr->jobtab_head; slot != NULL; slot = slot->next) {                  for (slot = SOA(shm_config->hdr->jobtab_head); slot != NULL; slot = SOA(slot->next)) {
   
                     if ((slot->pid != pid) && ((slot->flags & JFLG_FMADM) != JFLG_FMADM)) {                      if ((slot->pid != pid) && ((slot->flags & JFLG_FMADM) != JFLG_FMADM)) {
                         kill (slot->pid, SIGINT);                          kill (slot->pid, SIGINT);
Line 849  int main (int argc, char **argv, char ** Line 855  int main (int argc, char **argv, char **
                 exit (0);                  exit (0);
                                   
             }              }
               
             job_gc_mark ();              job_gc_mark ();
             job_set_status (pid, JSTAT_IDLE);              job_set_status (pid, JSTAT_IDLE);
             sleep (1);              sleep (1);
                           
             job_set_status (pid, JSTAT_HOUSEKEEPING);              job_set_status (pid, JSTAT_HOUSEKEEPING);
             job_gc_sweep ();              job_gc_sweep ();
               
             sleep (1);              sleep (1);
         }          }
                           

Removed from v.1.24  
changed lines
  Added in v.1.28


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>