On Mon, Aug 19, 2024 at 03:24:03PM GMT, Chaz Kettleson wrote:
> On Mon, Aug 19, 2024 at 03:48:20PM GMT, Omar Polo wrote:
> > On 2024/08/17 16:28:35 +0100, Stuart Henderson <s...@spacehopper.org> wrote:
> > > ok
> > 
> > Imported
> > 
> > Thank you,
> > 
> > Omar Polo
> > 
> 
> Thanks everyone! Great feedback.
> 
> Below are patches for pledge/unveil for feedback/discussion.
> 
> Here is the approach that was taken:
> 
> - Start with minimal set of promises that did not crash and from review
>     stdio
>     rpath - hopm config file, firedns config
>     wpath - pid file, log file, scanlog file
>     cpath - pid file, log file, scanlog file
>     inet
>     dns
>     proc - fork (maybe we can remove fork and rc_bg?)
>     exec - execv on restart
>     unveil
> - Initially unveil nothing
> - Remove unneeded chdir (locations are no longer relative)
> - Unveil only what is needed if it's needed before main loop
>     LOGFILE, wc
>     CONFFILE, r
>     SCANLOG, wc (only if the option is enabled)
>     HOPM_BINPATH, x (for execv on restart)
> - Reduce promises before main loop
>     stdio
>     inet
>     dns
>     exec
> 
> -- 
> Chaz
> 
> diff --git a/net/hopm/patches/patch-src_firedns_c 
> b/net/hopm/patches/patch-src_firedns_c
> new file mode 100644
> index 00000000000..10bc8d9af12
> --- /dev/null
> +++ b/net/hopm/patches/patch-src_firedns_c
> @@ -0,0 +1,21 @@
> +Index: firedns.c
> +--- src/firedns.c.orig
> ++++ src/firedns.c
> +@@ -36,6 +36,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  
> 02111-1307  USA
> + #include <stdio.h>
> + #include <errno.h>
> + #include <fcntl.h>
> ++#include <err.h>
> + 
> + #include "compat.h"
> + #include "memory.h"
> +@@ -171,6 +172,10 @@ firedns_init(void)
> +   memset(servers4, 0, sizeof(servers4));
> +   memset(servers6, 0, sizeof(servers6));
> + 
> ++  if (unveil(FDNS_CONFIG_PREF, "r") == -1) {
> ++    err(1, "unveil");
> ++  }
> ++
> +   /* read etc/firedns.conf if we've got it, otherwise parse 
> /etc/resolv.conf */
> +   f = fopen(FDNS_CONFIG_PREF, "r");
> diff --git a/net/hopm/patches/patch-src_main_c 
> b/net/hopm/patches/patch-src_main_c
> new file mode 100644
> index 00000000000..f0dcdc986d3
> --- /dev/null
> +++ b/net/hopm/patches/patch-src_main_c
> @@ -0,0 +1,86 @@
> +Index: main.c 
> +--- src/main.c.orig
> ++++ src/main.c
> +@@ -30,6 +30,7 @@
> + #include <fcntl.h>
> + #include <stdlib.h>
> + #include <string.h>
> ++#include <err.h>
> + 
> + #include "config.h"
> + #include "irc.h"
> +@@ -100,6 +101,14 @@ main(int argc, char *argv[])
> +   FILE *pidout;
> +   struct rlimit rlim;
> + 
> ++  if (pledge("stdio rpath wpath cpath inet dns proc exec unveil", NULL) == 
> -1) {
> ++    err(1, "pledge");
> ++  }
> ++
> ++  if (unveil("/", "")) {
> ++    err(1, "unveil");
> ++  }
> ++
> +   setup_corelimit();
> + 
> +   while (1)
> +@@ -130,12 +139,6 @@ main(int argc, char *argv[])
> +   snprintf(CONFFILE, lenc, "%s/%s.%s", CONFDIR, CONFNAME, CONFEXT);
> +   snprintf(LOGFILE, lenl, "%s/%s.%s", LOGDIR, CONFNAME, LOGEXT);
> + 
> +-  if (chdir(HOPM_PREFIX))
> +-  {
> +-    perror("chdir");
> +-    exit(EXIT_FAILURE);
> +-  }
> +-
> +   /* Fork off. */
> +   if (OPT_DEBUG == 0)
> +   {
> +@@ -172,6 +175,10 @@ main(int argc, char *argv[])
> +     if (fd > STDERR_FILENO)
> +       close(fd);
> + 
> ++    if (unveil(LOGFILE, "wc") == -1) {
> ++      err(1, "unveil");
> ++    }
> ++
> +     log_open(LOGFILE);
> +   }
> +   else
> +@@ -180,13 +187,34 @@ main(int argc, char *argv[])
> +   log_printf("MAIN -> HOPM %s started.", VERSION);
> +   log_printf("MAIN -> Reading configuration file...");
> + 
> ++  if (unveil(CONFFILE, "r") == -1) {
> ++    err(1, "unveil");
> ++  }
> ++
> +   config_load(CONFFILE);
> + 
> +-  if (OptionsItem.scanlog)
> ++  if (OptionsItem.scanlog) {
> ++    if (unveil(OptionsItem.scanlog, "wc")) {
> ++      err(1, "unveil");
> ++    }
> ++
> +     scanlog_open(OptionsItem.scanlog);
> ++  }
> ++
> ++  if (unveil(OptionsItem.pidfile, "wc")) {
> ++    err(1, "unveil");
> ++  }
> + 
> +   pidout = fopen(OptionsItem.pidfile, "w");
> + 
> ++  if (unveil(HOPM_BINPATH, "x") == -1) {
> ++    err(1, "unveil");
> ++  }
> ++
> ++  if (pledge("stdio inet dns exec", NULL) == -1) {
> ++    err(1, "pledge");
> ++  }
> ++
> +   if (pidout)
> +   {
> +     fprintf(pidout, "%u\n", (unsigned int)getpid());
> 

ping
-- 
Chaz

Reply via email to