Hello Matthias,

On Mon, Feb 10, 2020 at 02:43:05PM +0100, Matthias Schmidt wrote:
> Hi Michael,
> 
> On 10.02.2020 14:31, Michael wrote:
> > On Fri, Feb 07, 2020 at 03:27:33PM +0100, Michael wrote:
> > > Hello ports@,
> > > 
> > > this patch adds pledge() to net/ngircd. Tested on amd64 with ngircd
> > > running with TLS. Unfortunately the promises can't be further reduced
> > > since this would break /rehash (i.e. reloading the config) later. But
> > > this is better than nothing.
> > > 
> > > [...]
> > 
> > solene@ pointed out that if the option "PidFile" is being used
> > unlink()ing the file later fails. However I personally don't like adding
> > another promise just for that. I can't see any sensible use case for
> > ngircds PID file; the Option itself is not set by default.
> > 
> > So my idea would be to either skip or remove the PidFile code, or just
> > ignore the issue. The abort happens after shutting everything else down
> > and starting ngircd again works even if the old PID file is still in
> > place. Both variants mean changing or breaking functionality but that
> > would be bearable given the low impact IMHO. Using unveil() might also
> > be an option.
> > 
> > Any thoughts on this?
> 
> Active ngircd user here. I personally use the PID file with my monitoring
> system
> for process supervision (monit in my case). Although I could use process
> name
> matching, getting the PID from the PIDFile seems more natural.
> 
> Cheers
> 
>       Matthias
> 
> PS: I would appreciate a pledged ngircd very much.
> 

Yes, pledge() for ngircd is long overdue :) Below is an updated patch 
that handles having PidFile configured. I am unsure if details like 
having PidFile set enables the "cpath" promise should be documented or 
not.

Index: Makefile
===================================================================
RCS file: /cvs/ports/net/ngircd/Makefile,v
retrieving revision 1.18
diff -u -p -u -p -r1.18 Makefile
--- Makefile    12 Jul 2019 20:48:34 -0000      1.18
+++ Makefile    11 Feb 2020 10:24:57 -0000
@@ -4,6 +4,8 @@ COMMENT =       lightweight irc server
 
 DISTNAME =     ngircd-25
 
+REVISION =     0
+
 CATEGORIES =   net
 
 HOMEPAGE =     https://ngircd.barton.de/
Index: patches/patch-src_ngircd_ngircd_c
===================================================================
RCS file: /cvs/ports/net/ngircd/patches/patch-src_ngircd_ngircd_c,v
retrieving revision 1.4
diff -u -p -u -p -r1.4 patch-src_ngircd_ngircd_c
--- patches/patch-src_ngircd_ngircd_c   3 Dec 2014 10:32:18 -0000       1.4
+++ patches/patch-src_ngircd_ngircd_c   11 Feb 2020 10:24:57 -0000
@@ -1,7 +1,25 @@
 $OpenBSD: patch-src_ngircd_ngircd_c,v 1.4 2014/12/03 10:32:18 jasper Exp $
---- src/ngircd/ngircd.c.orig   Mon Jul 14 13:26:07 2014
-+++ src/ngircd/ngircd.c        Tue Dec  2 20:05:31 2014
-@@ -563,7 +563,7 @@ Setup_FDStreams(int fd)
+Index: src/ngircd/ngircd.c
+--- src/ngircd/ngircd.c.orig
++++ src/ngircd/ngircd.c
+@@ -259,6 +259,16 @@ main(int argc, const char *argv[])
+                       exit(1);
+               }
+ 
++              /* XXX using a PID file needs cpath to unlink() later */
++              if(Conf_PidFile[0]) {
++                      if ( pledge("stdio inet dns rpath proc getpw cpath", 
NULL) == -1)
++                              err(1, "pledge");
++              }
++              else {
++                      if ( pledge("stdio inet dns rpath proc getpw", NULL) == 
-1)
++                              err(1, "pledge");
++              }
++
+               /* Initialize modules, part II: these functions are eventually
+                * called with already dropped privileges ... */
+               Channel_Init();
+@@ -563,7 +573,7 @@ Setup_FDStreams(int fd)
  #if !defined(SINGLE_USER_OS)
  
  /**
@@ -10,7 +28,7 @@ $OpenBSD: patch-src_ngircd_ngircd_c,v 1.
   *
   * @param uid User ID
   * @param gid Group ID
-@@ -587,7 +587,7 @@ NGIRCd_getNobodyID(uid_t *uid, gid_t *gid )
+@@ -587,7 +597,7 @@ NGIRCd_getNobodyID(uid_t *uid, gid_t *gid )
        }
  #endif
  
@@ -19,7 +37,7 @@ $OpenBSD: patch-src_ngircd_ngircd_c,v 1.
        if (!pwd)
                return false;
  
-@@ -703,11 +703,11 @@ NGIRCd_Init(bool NGIRCd_NoDaemon)
+@@ -703,11 +713,11 @@ NGIRCd_Init(bool NGIRCd_NoDaemon)
        if (Conf_UID == 0) {
                pwd = getpwuid(0);
                Log(LOG_INFO,
Index: patches/patch-src_ngircd_proc_c
===================================================================
RCS file: patches/patch-src_ngircd_proc_c
diff -N patches/patch-src_ngircd_proc_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_ngircd_proc_c     11 Feb 2020 10:24:57 -0000
@@ -0,0 +1,15 @@
+$OpenBSD$
+
+Index: src/ngircd/proc.c
+--- src/ngircd/proc.c.orig
++++ src/ngircd/proc.c
+@@ -76,6 +76,9 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc
+               return -1;
+       case 0:
+               /* New child process: */
++              /* XXX no PAM, fork only for DNS */
++              if (pledge("stdio dns", NULL) == -1)   
++                      err(1, "pledge"); 
+ #ifdef HAVE_ARC4RANDOM_STIR
+               arc4random_stir();
+ #endif

Reply via email to