--- freem/src/mumps.c 2025/04/13 04:22:43 1.20 +++ freem/src/mumps.c 2025/04/16 05:37:06 1.24 @@ -1,5 +1,5 @@ /* - * $Id: mumps.c,v 1.20 2025/04/13 04:22:43 snw Exp $ + * $Id: mumps.c,v 1.24 2025/04/16 05:37:06 snw Exp $ * main module of freem * * @@ -24,6 +24,18 @@ * along with FreeM. If not, see . * * $Log: mumps.c,v $ + * Revision 1.24 2025/04/16 05:37:06 snw + * Refine FreeBSD ASLR fix + * + * Revision 1.23 2025/04/16 05:33:15 snw + * Try to use procctl function to fix ASLR problem on FreeBSD + * + * Revision 1.22 2025/04/15 16:49:36 snw + * Make use of logprintf throughout codebase + * + * Revision 1.21 2025/04/15 02:24:43 snw + * Improve FreeM logging capabilities + * * Revision 1.20 2025/04/13 04:22:43 snw * Fix snprintf calls * @@ -109,8 +121,10 @@ #include #include #include - - +#include "log.h" +#if defined(__FreeBSD__) +# include +#endif #if defined(HAVE_GETOPT_H) # include #endif @@ -124,7 +138,6 @@ extern char *getenv(const char *name); void freem_usage(void); void freem_print_version(void); void init_ztrap(void); -void m_log (int, const char *); int main (int argc, char **argv, char **envp) { @@ -205,6 +218,9 @@ int main (int argc, char **argv, char ** strcpy (stack0, argv[0]); stcnv_c2m (stack0); +#if defined(__FreeBSD__) + int prcdta = PROC_ASLR_FORCE_DISABLE; +#endif /* strncpy (config_file, SYSCONFDIR"/freem.conf", 100); */ @@ -466,61 +482,51 @@ int main (int argc, char **argv, char ** snprintf (env_config_file, sizeof (config_file) - 1, "%s/freem/env.conf", SYSCONFDIR); if (!file_exists (env_config_file)) { - fprintf (stderr, "freem: environment catalog does not exist; may need to run fmadm configure\n"); - exit (1); + logprintf (FM_LOG_FATAL, "freem: environment catalog does not exist; may need to run fmadm configure"); } if (!file_exists (config_file)) { - fprintf (stderr, "freem: configuration file for %s does not exist; may need to run fmadm configure\n", shm_env); - exit (1); + logprintf (FM_LOG_FATAL, "freem: configuration file for %s does not exist; may need to run fmadm configure", shm_env); } if (read_profile_string (env_config_file, shm_env, "user", d_username) == FALSE) { - fprintf (stderr, "freem: could not determine owning user for environment %s\n", shm_env); - exit (1); + logprintf (FM_LOG_FATAL, "freem: could not determine owning user for environment %s", shm_env); } if (read_profile_string (env_config_file, shm_env, "group", d_groupname) == FALSE) { - fprintf (stderr, "freem: could not determine owning group for environment %s\n", shm_env); - exit (1); + logprintf (FM_LOG_FATAL, "freem: could not determine owning group for environment %s", shm_env); } if (read_profile_string (env_config_file, shm_env, "enabled", env_ena) == FALSE) { - fprintf (stderr, "freem: could not discover enabled state for environment %s\n", shm_env); - exit (1); + logprintf (FM_LOG_FATAL, "freem: could not discover enabled state for environment %s", shm_env); } if (strcmp (env_ena, "true") != 0) { - fprintf (stderr, "freem: environment %s is administratively disabled\n", shm_env); - exit (1); + logprintf (FM_LOG_FATAL, "freem: environment %s is administratively disabled", shm_env); } d_grp = getgrnam (d_groupname); if (d_grp == NULL) { - fprintf (stderr, "freem: invalid group '%s'\n", d_groupname); - exit (1); + logprintf (FM_LOG_FATAL, "freem: invalid group '%s'", d_groupname); } d_gid = d_grp->gr_gid; d_user = getpwnam (d_username); if (d_user == NULL) { - fprintf (stderr, "freem: invalid user '%s'\n", d_username); - exit (1); + logprintf (FM_LOG_FATAL, "freem: invalid user '%s'", d_username); } d_uid = d_user->pw_uid; #if defined(__linux__) if (run_daemon == FALSE && group_member (d_gid) == 0) { - fprintf (stderr, "freem: you must be a member of the %s group to use environment %s\n", d_groupname, shm_env); - exit (1); + logprintf (FM_LOG_FATAL, "freem: you must be a member of the %s group to use environment %s", d_groupname, shm_env); } #endif if (run_daemon == TRUE) { if (geteuid () != 0 && nofork == FALSE) { - fprintf (stderr, "freem: forking daemon must be run as root\n"); - exit (1); + logprintf (FM_LOG_FATAL, "freem: forking daemon must be run as root"); } } @@ -532,15 +538,15 @@ int main (int argc, char **argv, char ** if ((run_daemon == TRUE) && (nofork == FALSE)) { int fork_fd; + + init_log (); /* daemonize */ fork_pid = fork (); if (fork_pid < 0) { - fprintf (stderr, "freem: failure in fork()\r\n"); - m_log (1, "failure in initial fork()\r\n"); - exit (1); + logprintf (FM_LOG_FATAL, "environment error: failure in initial fork()"); } if (fork_pid > 0) { @@ -548,9 +554,7 @@ int main (int argc, char **argv, char ** } if (setsid () < 0) { - fprintf (stderr, "freem: failure in setsid()\r\n"); - m_log (1, "failure in setsid()\r\n"); - exit (1); + logprintf (FM_LOG_FATAL, "environment error: failure in setsid()"); } signal (SIGCHLD, SIG_IGN); @@ -558,14 +562,12 @@ int main (int argc, char **argv, char ** fork_pid = fork (); if (fork_pid < 0) { - fprintf (stderr, "freem: failure in fork()\r\n"); - m_log (1, "failure in second fork()\r\n"); - exit (1); + logprintf (FM_LOG_FATAL, "environment error: failure in second fork()"); } if (fork_pid > 0) { + logprintf (FM_LOG_DEBUG, "environment: exiting from second fork()"); exit (0); - m_log (1, "exiting from second fork"); } umask (0); @@ -577,34 +579,28 @@ int main (int argc, char **argv, char ** } if (geteuid () == 0) { - /* shed privileges */ - - fprintf (stderr, "freem: switching to group %s\n", d_groupname); - m_log (1, "switching groups"); + /* shed privileges */ + logprintf (FM_LOG_INFO, "environment: switching to group %s", d_groupname); if (setgid (d_gid) == -1) { - fprintf (stderr, "freem: failure switching GID\n"); - m_log (1, "failure switching GIDs"); - exit (1); + logprintf (FM_LOG_FATAL, "environment error: failure switching GID"); } if (d_uid != geteuid ()) { - fprintf (stderr, "freem: switching to username %s\n", d_username); - m_log (1, "switching users"); + + logprintf (FM_LOG_INFO, "environment: switching to username %s", d_username); if (setuid (d_uid) == -1) { - fprintf (stderr, "freem: failure switching UID\n"); - m_log (1, "failure switching UIDs"); - exit (1); + logprintf (FM_LOG_FATAL, "environment error: failure switching UID"); } } } else { - fprintf (stderr, "not euid 0"); + logprintf (FM_LOG_INFO, "environment: not running as superuser; not shedding privileges"); } freopen ("/dev/null", "r", stdin); @@ -627,18 +623,12 @@ int main (int argc, char **argv, char ** errsav = errno; if (pid_fd < 0) { - fprintf (stderr, "freem: could not open PID file %s [%s]\n", pid_file_path, strerror (errsav)); - m_log (1, "freem: could not open PID file"); - m_log (1, strerror (errsav)); - exit (1); + logprintf (FM_LOG_FATAL, "environment error: could not open PID file %s [%s]", pid_file_path, strerror (errsav)); } if (lockf (pid_fd, F_TLOCK, 0) < 0) { errsav = errno; - fprintf (stderr, "freem: could not lock PID file [%s]\n", strerror (errsav)); - m_log (1, "freem: could not lock PID file - perhaps already running?"); - m_log (1, strerror (errsav)); - exit (1); + logprintf (FM_LOG_FATAL, "environment error: could not lock PID file [%s]", strerror (errsav)); } sprintf (pidfile_buf, "%ld\n", (long) getpid ()); @@ -772,22 +762,27 @@ int main (int argc, char **argv, char ** } } +#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) { char verstr[500]; pid_t stop_requester; if (run_daemon == FALSE) { - fprintf (stderr, "freem: re-run with --daemon or -d command-line flags\r\n"); - cleanup (); - exit (1); + logprintf (FM_LOG_FATAL, "freem: re-run with --daemon or -d command-line flags"); } stcpy (verstr, FREEM_VERSION_STR); stcnv_m2c (verstr); fprintf (stderr, "Coherent Logic Development FreeM version %s\r\n", verstr); - fprintf (stderr, "freem: shared memory for environment %s initialized (%ld bytes of shared memory @ '%p')\r\nfreem: system ready\r\n", shm_env, (long) shm_init_size, shm_config->dta); + logprintf (FM_LOG_INFO, "freem: shared memory for environment %s initialized (%ld bytes of shared memory @ '%p')", shm_env, (long) shm_init_size, shm_config->dta); for (;;) { @@ -798,8 +793,7 @@ int main (int argc, char **argv, char ** job_slot_t *slot; - fprintf (stderr, "freem: entering maintenance mode\r\n"); - m_log (1, "freem: entering maintenance mode"); + logprintf (FM_LOG_WARNING, "environment: entering maintenance mode"); for (slot = shm_config->hdr->jobtab_head; slot != NULL; slot = slot->next) { @@ -818,29 +812,29 @@ int main (int argc, char **argv, char ** connected_jobs = job_count (); - fprintf (stderr, "freem: STOP requested by pid %d\r\n", stop_requester); - fprintf (stderr, "freem: there are %d job(s) connected to this environment\r\n", connected_jobs); + logprintf (FM_LOG_INFO, "environment: STOP requested by pid %ld", stop_requester); + logprintf (FM_LOG_INFO, "environment: there are %d job(s) connected to this environment", connected_jobs); if (connected_jobs > 1) { - fprintf (stderr, "freem: asking non-daemon job(s) to disconnect and halt...\r\n"); + logprintf (FM_LOG_INFO, "environment: asking non-daemon job(s) to disconnect and halt..."); job_request_all_stop (); - fprintf (stderr, "freem: waiting 5 seconds for job(s) to disconnect...\r\n"); + logprintf (FM_LOG_INFO, "environment: waiting 5 seconds for job(s) to disconnect..."); sleep (5); connected_jobs = job_count (); - if (connected_jobs > 1) { - fprintf (stderr, "freem: sending SIGTERM to %d job(s)...\r\n", connected_jobs); + if (connected_jobs > 1) { + logprintf (FM_LOG_INFO, "environment: sending SIGTERM to %d job(s)...", connected_jobs); job_signal_all (SIGTERM); - fprintf (stderr, "freem: waiting 5 seconds for job(s) to disconnect...\r\n"); + logprintf (FM_LOG_INFO, "environment: waiting 5 seconds for job(s) to disconnect..."); sleep (5); } connected_jobs = job_count (); if (connected_jobs > 1) { - fprintf (stderr, "freem: sending SIGKILL to %d job(s)...\r\n", connected_jobs); + logprintf (FM_LOG_INFO, "environment: sending SIGKILL to %d job(s)...", connected_jobs); job_signal_all (SIGKILL); } @@ -849,7 +843,7 @@ int main (int argc, char **argv, char ** } - fprintf (stderr, "freem: terminating\r\n"); + logprintf (FM_LOG_INFO, "freem: terminating"); cleanup (); exit (0);