> Thinking about it .. would a call to access(2) with R_OK|W_OK|R_OK|F_OK 
> satisfy
> everyone ? Or only F_OK ?

Sounds better than chdir(2), but it will lack if datadir was passed to access(2)
without including trailing "/"

eg with access(datadir, F_OK):
$ touch /home/gsoares/testfile   <- creating a file, not a directory     
$ doas ./ldapd -r /home/gsoares/testfile ; echo $?      <- no trailing 
/home/gsoares/testfile"/"
0

so for directory existence check, I would suggest to use just stat(2). diff 
attached.
Index: ldapd.c
===================================================================
RCS file: /cvs/src/usr.sbin/ldapd/ldapd.c,v
retrieving revision 1.17
diff -u -p -r1.17 ldapd.c
--- ldapd.c     1 Feb 2016 20:00:18 -0000       1.17
+++ ldapd.c     2 Feb 2016 10:10:43 -0000
@@ -17,6 +17,7 @@
  */
 
 #include <sys/queue.h>
+#include <sys/stat.h>
 #include <sys/un.h>
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -117,6 +118,7 @@ main(int argc, char *argv[])
        struct event             ev_sigterm;
        struct event             ev_sigchld;
        struct event             ev_sighup;
+       struct stat              s;
 
        datadir = DATADIR;
        log_init(1);            /* log to stderr until daemonized */
@@ -178,8 +180,8 @@ main(int argc, char *argv[])
                skip_chroot = 1;
        }
 
-       if (datadir && chdir(datadir))
-               err(1, "chdir");
+       if ((stat(datadir, &s) == -1) || !S_ISDIR(s.st_mode))
+               errx(1, "Invalid directory");
 
        if (!skip_chroot && (pw = getpwnam(LDAPD_USER)) == NULL)
                err(1, "%s", LDAPD_USER);

Reply via email to