Committed, thanks.
On 3/4/20 9:11 PM, Robert Klein wrote:
> Hi,
>
> On Tue, 3 Mar 2020 20:45:17 +0100
> Martijn van Duren <openbsd+t...@list.imperialat.at> wrote:
>
>> I don't agree with this diff, even though you're right with it being
>> broken. Right now the regress test uses it/tries to use it and even
>> though someone trying to run regress on an actual production machine
>> somewhat deserves to get shot in the foot, I don't think we should
>> make that our goal.
>>
>> Also, I can see this being a helpful feature for people doing some
>> development work (e.g. testing with delegations etc without setting
>> up a vm-environment).
>>
>> Could you please look into fixing the actual issue?
>
> this patch fixes only the two issues. I de-const'd "char * datadir" in
> ldapd to get rid of the new warning.
>
> Best regards
> Robert
>
>
> diff 1813335e849f285a868ea3d474b4704812b1843e /usr/src
> blob - c8564c5543f518a720e049c559556f87edda6b8a
> file + usr.sbin/ldapctl/ldapctl.c
> --- usr.sbin/ldapctl/ldapctl.c
> +++ usr.sbin/ldapctl/ldapctl.c
> @@ -150,7 +150,7 @@ index_namespace(struct namespace *ns, const char *data
>
> log_info("indexing namespace %s", ns->suffix);
>
> - if (asprintf(&path, "%s/%s_data.db", DATADIR, ns->suffix) == -1)
> + if (asprintf(&path, "%s/%s_data.db", datadir, ns->suffix) == -1)
> return -1;
> data_db = btree_open(path, BT_NOSYNC | BT_REVERSEKEY, 0644);
> free(path);
> blob - 797a36f89f33233c2d9655a307ec5e727b9fbaa1
> file + usr.sbin/ldapd/ldapd.c
> --- usr.sbin/ldapd/ldapd.c
> +++ usr.sbin/ldapd/ldapd.c
> @@ -55,7 +55,7 @@ static pid_t start_child(enum ldapd_process, char
> *,
>
> struct ldapd_stats stats;
> pid_t ldape_pid;
> -const char *datadir = DATADIR;
> +char *datadir = DATADIR;
>
> void
> usage(void)
> @@ -415,7 +415,7 @@ static pid_t
> start_child(enum ldapd_process p, char *argv0, int fd, int debug,
> int verbose, char *csockpath, char *conffile)
> {
> - char *argv[9];
> + char *argv[11];
> int argc = 0;
> pid_t pid;
>
> @@ -459,7 +459,11 @@ start_child(enum ldapd_process p, char *argv0, int fd,
> argv[argc++] = "-f";
> argv[argc++] = conffile;
> }
> -
> + if (datadir) {
> + argv[argc++] = "-r";
> + argv[argc++] = datadir;
> + }
> +
> argv[argc++] = NULL;
>
> execvp(argv0, argv);
> blob - 2259f57bde3c2918a8b200747c194e5768ae40f1
> file + usr.sbin/ldapd/namespace.c
> --- usr.sbin/ldapd/namespace.c
> +++ usr.sbin/ldapd/namespace.c
> @@ -29,7 +29,7 @@
> #include "ldapd.h"
> #include "log.h"
>
> -extern const char *datadir;
> +extern char *datadir;
>
> /* Maximum number of requests to queue per namespace during compaction.
> * After this many requests, we return LDAP_BUSY.
>
>>
>> martijn@
>>
>> On 3/2/20 8:00 PM, Robert Klein wrote:
>>> Hi,
>>>
>>> in ldapd and ldapctl the "-r directory" command line argument does
>>> not work:
>>>
>>> ldapd fork/execs itself but the directory command line argument is
>>> not given to the execvp call which then uses the default data
>>> directory.
>>>
>>> ldapctl has a thinko/typo which causes the data_db to be always
>>> opened in the default directory for indexing.
>>>
>>> The patch below removes the command line argument and corresponding
>>> global variable and instead uses a configuration file directive
>>> "datadir". Incidentally removes the global 'datadir' variable used
>>> before.
>>>
>>> Best regards
>>> Robert
>>>
>>>
>>> -----------------------------------------------
>>> commit 6a71c90c19b5dc5850305c15696af3f14d26c168 (master)
>>> from: Robert Klein <rokl...@roklein.de>
>>> date: Mon Mar 2 18:50:12 2020 UTC
>>>
>>> fix ldapd/ldapctl data directory handling
>>>
>>> -r directive didn't work as intended in both
>>> ldapd and ldapctl.
>>>
>>> this patch replaces command line argument '-r directory'
>>> with a configuration file directive 'datadir'.
>>>
>>> diff f62b80b397c780e8273b5cc67d544b951c4c9d1f
>>> 35bb29194b2067dab925ec4566dfb82f9bf34d65 blob -
>>> 48cff01b435bca0deebf28f55e6f71675c5752f2 blob +
>>> 231af2ddbbee2da446d2f03c9c48e679e216e993 ---
>>> usr.sbin/ldapctl/ldapctl.8 +++ usr.sbin/ldapctl/ldapctl.8
>>> @@ -24,7 +24,6 @@
>>> .Nm ldapctl
>>> .Op Fl v
>>> .Op Fl f Ar file
>>> -.Op Fl r Ar directory
>>> .Op Fl s Ar socket
>>> .Ar command
>>> .Op Ar argument ...
>>> @@ -42,11 +41,6 @@ Use
>>> .Ar file
>>> as the configuration file, instead of the default
>>> .Pa /etc/ldapd.conf .
>>> -.It Fl r Ar directory
>>> -Store and read database files in
>>> -.Ar directory ,
>>> -instead of the default
>>> -.Pa /var/db/ldap .
>>> .It Fl s Ar socket
>>> Use
>>> .Ar socket
>>> blob - c8564c5543f518a720e049c559556f87edda6b8a
>>> blob + 6830a603d153794390faafbc9aadc8ef0bd985c0
>>> --- usr.sbin/ldapctl/ldapctl.c
>>> +++ usr.sbin/ldapctl/ldapctl.c
>>> @@ -58,10 +58,10 @@ void show_stats(struct imsg
>>> *imsg); void show_dbstats(const char *prefix,
>>> struct btree_stat *st); void show_nsstats(struct
>>> imsg *imsg); int compact_db(const char *path);
>>> -int compact_namespace(struct namespace *ns, const
>>> char *datadir); -int compact_namespaces(const char
>>> *datadir); -int index_namespace(struct namespace
>>> *ns, const char *datadir); -int
>>> index_namespaces(const char *datadir); +int
>>> compact_namespace(struct namespace *ns); +int
>>> compact_namespaces(void); +int
>>> index_namespace(struct namespace *ns); +int
>>> index_namespaces(void); int
>>> ssl_load_certfile(struct ldapd_config *, const char *, u_int8_t);
>>> __dead void
>>> @@ -70,7 +70,7 @@ usage(void)
>>> extern char *__progname;
>>>
>>> fprintf(stderr,
>>> - "usage: %s [-v] [-f file] [-r directory] [-s socket] "
>>> + "usage: %s [-v] [-f file] [-s socket] "
>>> "command [argument ...]\n",
>>> __progname);
>>> exit(1);
>>> @@ -97,11 +97,11 @@ compact_db(const char *path)
>>> }
>>>
>>> int
>>> -compact_namespace(struct namespace *ns, const char *datadir)
>>> +compact_namespace(struct namespace *ns)
>>> {
>>> char *path;
>>>
>>> - if (asprintf(&path, "%s/%s_data.db", datadir, ns->suffix)
>>> == -1)
>>> + if (asprintf(&path, "%s/%s_data.db", conf->datadir,
>>> ns->suffix) == -1) return -1;
>>> if (compact_db(path) != 0) {
>>> log_warn("%s", path);
>>> @@ -110,7 +110,7 @@ compact_namespace(struct namespace *ns, const
>>> char *da }
>>> free(path);
>>>
>>> - if (asprintf(&path, "%s/%s_indx.db", datadir, ns->suffix)
>>> == -1)
>>> + if (asprintf(&path, "%s/%s_indx.db", conf->datadir,
>>> ns->suffix) == -1) return -1;
>>> if (compact_db(path) != 0) {
>>> log_warn("%s", path);
>>> @@ -123,14 +123,14 @@ compact_namespace(struct namespace *ns, const
>>> char *da }
>>>
>>> int
>>> -compact_namespaces(const char *datadir)
>>> +compact_namespaces()
>>> {
>>> struct namespace *ns;
>>>
>>> TAILQ_FOREACH(ns, &conf->namespaces, next) {
>>> if (SLIST_EMPTY(&ns->referrals))
>>> continue;
>>> - if (compact_namespace(ns, datadir) != 0)
>>> + if (compact_namespace(ns) != 0)
>>> return -1;
>>> }
>>>
>>> @@ -138,7 +138,7 @@ compact_namespaces(const char *datadir)
>>> }
>>>
>>> int
>>> -index_namespace(struct namespace *ns, const char *datadir)
>>> +index_namespace(struct namespace *ns)
>>> {
>>> struct btval key, val;
>>> struct btree *data_db, *indx_db;
>>> @@ -150,14 +150,14 @@ index_namespace(struct namespace *ns, const
>>> char *data
>>> log_info("indexing namespace %s", ns->suffix);
>>>
>>> - if (asprintf(&path, "%s/%s_data.db", DATADIR, ns->suffix)
>>> == -1)
>>> + if (asprintf(&path, "%s/%s_data.db", conf->datadir,
>>> ns->suffix) == -1) return -1;
>>> data_db = btree_open(path, BT_NOSYNC | BT_REVERSEKEY,
>>> 0644); free(path);
>>> if (data_db == NULL)
>>> return -1;
>>>
>>> - if (asprintf(&path, "%s/%s_indx.db", datadir, ns->suffix)
>>> == -1)
>>> + if (asprintf(&path, "%s/%s_indx.db", conf->datadir,
>>> ns->suffix) == -1) return -1;
>>> indx_db = btree_open(path, BT_NOSYNC, 0644);
>>> free(path);
>>> @@ -219,14 +219,14 @@ index_namespace(struct namespace *ns, const
>>> char *data }
>>>
>>> int
>>> -index_namespaces(const char *datadir)
>>> +index_namespaces()
>>> {
>>> struct namespace *ns;
>>>
>>> TAILQ_FOREACH(ns, &conf->namespaces, next) {
>>> if (SLIST_EMPTY(&ns->referrals))
>>> continue;
>>> - if (index_namespace(ns, datadir) != 0)
>>> + if (index_namespace(ns) != 0)
>>> return -1;
>>> }
>>>
>>> @@ -247,7 +247,6 @@ main(int argc, char *argv[])
>>> ssize_t n;
>>> int ch;
>>> enum action action = NONE;
>>> - const char *datadir = DATADIR;
>>> struct stat sb;
>>> const char *sock = LDAPD_SOCKET;
>>> char *conffile = CONFFILE;
>>> @@ -262,9 +261,6 @@ main(int argc, char *argv[])
>>> case 'f':
>>> conffile = optarg;
>>> break;
>>> - case 'r':
>>> - datadir = optarg;
>>> - break;
>>> case 's':
>>> sock = optarg;
>>> break;
>>> @@ -282,11 +278,6 @@ main(int argc, char *argv[])
>>> if (argc == 0)
>>> usage();
>>>
>>> - if (stat(datadir, &sb) == -1)
>>> - err(1, "%s", datadir);
>>> - if (!S_ISDIR(sb.st_mode))
>>> - errx(1, "%s is not a directory", datadir);
>>> -
>>> ldap_loginit(NULL, 1, verbose);
>>>
>>> if (strcmp(argv[0], "stats") == 0)
>>> @@ -311,13 +302,22 @@ main(int argc, char *argv[])
>>> if (parse_config(conffile) != 0)
>>> exit(2);
>>>
>>> + if (conf->datadir == NULL) {
>>> + if (asprintf(&conf->datadir, "%s",
>>> LDAPD_DATADIR) == -1)
>>> + errx(1, "malloc failed");
>>> + }
>>> + if (stat(conf->datadir, &sb) == -1)
>>> + err(1, "%s", conf->datadir);
>>> + if (!S_ISDIR(sb.st_mode))
>>> + errx(1, "%s is not a directory",
>>> conf->datadir); +
>>> if (pledge("stdio rpath wpath cpath flock", NULL)
>>> == -1) err(1, "pledge");
>>>
>>> if (action == COMPACT_DB)
>>> - return compact_namespaces(datadir);
>>> + return compact_namespaces();
>>> else
>>> - return index_namespaces(datadir);
>>> + return index_namespaces();
>>> }
>>>
>>> /* connect to ldapd control socket */
>>> blob - db5a0be5ad93c11c0dd773d342ea131328dcaa82
>>> blob + 8588bbe3dc5ffd81b91967cf809681b1998cbd69
>>> --- usr.sbin/ldapd/ldapd.8
>>> +++ usr.sbin/ldapd/ldapd.8
>>> @@ -27,7 +27,6 @@
>>> .Fl D Ar macro Ns = Ns Ar value
>>> .Oc
>>> .Op Fl f Ar file
>>> -.Op Fl r Ar directory
>>> .Op Fl s Ar file
>>> .Sh DESCRIPTION
>>> .Nm
>>> @@ -61,11 +60,6 @@ as the configuration file, instead of the default
>>> .It Fl n
>>> Configtest mode.
>>> Only check the configuration file for validity.
>>> -.It Fl r Ar directory
>>> -Store and read database files in
>>> -.Ar directory ,
>>> -instead of the default
>>> -.Pa /var/db/ldap .
>>> .It Fl s Ar file
>>> Specify an alternative location for the socket file.
>>> .It Fl v
>>> blob - 797a36f89f33233c2d9655a307ec5e727b9fbaa1
>>> blob + 69ae065ae99ba9ab326afd1fe0db5eeb820ea629
>>> --- usr.sbin/ldapd/ldapd.c
>>> +++ usr.sbin/ldapd/ldapd.c
>>> @@ -55,7 +55,6 @@ static pid_t start_child(enum
>>> ldapd_process, char *,
>>> struct ldapd_stats stats;
>>> pid_t ldape_pid;
>>> -const char *datadir = DATADIR;
>>>
>>> void
>>> usage(void)
>>> @@ -63,7 +62,7 @@ usage(void)
>>> extern char *__progname;
>>>
>>> fprintf(stderr, "usage: %s [-dnv] [-D macro=value] "
>>> - "[-f file] [-r directory] [-s file]\n", __progname);
>>> + "[-f file] [-s file]\n", __progname);
>>> exit(1);
>>> }
>>>
>>> @@ -151,9 +150,6 @@ main(int argc, char *argv[])
>>> case 'n':
>>> configtest = 1;
>>> break;
>>> - case 'r':
>>> - datadir = optarg;
>>> - break;
>>> case 's':
>>> csockpath = optarg;
>>> break;
>>> @@ -193,15 +189,20 @@ main(int argc, char *argv[])
>>> exit(0);
>>> }
>>>
>>> + if (conf->datadir == NULL) {
>>> + if (asprintf(&conf->datadir, "%s", LDAPD_DATADIR)
>>> == -1)
>>> + errx(1, "malloc failed");
>>> + }
>>> +
>>> log_init(debug, LOG_DAEMON);
>>>
>>> if (eflag)
>>> ldape(debug, verbose, csockpath);
>>>
>>> - if (stat(datadir, &sb) == -1)
>>> - err(1, "%s", datadir);
>>> + if (stat(conf->datadir, &sb) == -1)
>>> + err(1, "%s", conf->datadir);
>>> if (!S_ISDIR(sb.st_mode))
>>> - errx(1, "%s is not a directory", datadir);
>>> + errx(1, "%s is not a directory", conf->datadir);
>>>
>>> if (!debug) {
>>> if (daemon(1, 0) == -1)
>>> @@ -213,7 +214,7 @@ main(int argc, char *argv[])
>>> if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC |
>>> SOCK_NONBLOCK, PF_UNSPEC, pipe_parent2ldap) != 0)
>>> fatal("socketpair");
>>> -
>>> +
>>> ldape_pid = start_child(PROC_LDAP_SERVER, saved_argv0,
>>> pipe_parent2ldap[1], debug, verbose, csockpath,
>>> conffile);
>>> @@ -392,7 +393,7 @@ ldapd_open_request(struct imsgev *iev, struct
>>> imsg *im /* make sure path is null-terminated */
>>> oreq->path[PATH_MAX] = '\0';
>>>
>>> - if (strncmp(oreq->path, datadir, strlen(datadir)) != 0) {
>>> + if (strncmp(oreq->path, conf->datadir,
>>> strlen(conf->datadir)) != 0) { log_warnx("refusing to open file
>>> %s", oreq->path); fatal("ldape sent invalid open request");
>>> }
>>> @@ -459,7 +460,7 @@ start_child(enum ldapd_process p, char *argv0,
>>> int fd, argv[argc++] = "-f";
>>> argv[argc++] = conffile;
>>> }
>>> -
>>> +
>>> argv[argc++] = NULL;
>>>
>>> execvp(argv0, argv);
>>> blob - 3da0137e137e8b3bc64f6351579fcd6a9344b1f8
>>> blob + 31c894c3e39ab70f3324415ecac5efc1301e0a54
>>> --- usr.sbin/ldapd/ldapd.conf.5
>>> +++ usr.sbin/ldapd/ldapd.conf.5
>>> @@ -130,6 +130,11 @@ The URL has the following format:
>>> ldap://ldap.example.com
>>> ldaps://ldap.example.com:3890
>>> .Ed
>>> +.It datadir Ar directory
>>> +Store and read database files in
>>> +.Ar directory ,
>>> +instead of the default
>>> +.Pa /var/db/ldap .
>>> .It rootdn Ar dn
>>> Specify the distinguished name of the root user for all namespaces.
>>> The root user is always allowed to read and write entries in all
>>> blob - 3f995d184b442f094a95f089e3bb4a727eabf559
>>> blob + 2736d366bf5f92e3579f915f4ceb2a3610d27d54
>>> --- usr.sbin/ldapd/ldapd.h
>>> +++ usr.sbin/ldapd/ldapd.h
>>> @@ -41,7 +41,7 @@
>>> #define CONFFILE "/etc/ldapd.conf"
>>> #define LDAPD_USER "_ldapd"
>>> #define LDAPD_SOCKET "/var/run/ldapd.sock"
>>> -#define DATADIR "/var/db/ldap"
>>> +#define LDAPD_DATADIR "/var/db/ldap"
>>> #define LDAP_PORT 389
>>> #define LDAPS_PORT 636
>>> #define LDAPD_SESSION_TIMEOUT 30
>>> @@ -252,6 +252,7 @@ struct ldapd_config
>>> struct schema *schema;
>>> char *rootdn;
>>> char *rootpw;
>>> + char *datadir;
>>> };
>>>
>>> struct ldapd_stats
>>> blob - 2259f57bde3c2918a8b200747c194e5768ae40f1
>>> blob + 2e39abf6cc94ac6f301876df996a6229a032a7b7
>>> --- usr.sbin/ldapd/namespace.c
>>> +++ usr.sbin/ldapd/namespace.c
>>> @@ -29,8 +29,6 @@
>>> #include "ldapd.h"
>>> #include "log.h"
>>>
>>> -extern const char *datadir;
>>> -
>>> /* Maximum number of requests to queue per namespace during
>>> compaction.
>>> * After this many requests, we return LDAP_BUSY.
>>> */
>>> @@ -118,7 +116,8 @@ namespace_open(struct namespace *ns)
>>> if (ns->sync == 0)
>>> db_flags |= BT_NOSYNC;
>>>
>>> - if (asprintf(&ns->data_path, "%s/%s_data.db", datadir,
>>> ns->suffix) == -1)
>>> + if (asprintf(&ns->data_path, "%s/%s_data.db",
>>> conf->datadir,
>>> + ns->suffix) == -1)
>>> return -1;
>>> log_info("opening namespace %s", ns->suffix);
>>> ns->data_db = btree_open(ns->data_path, db_flags |
>>> BT_REVERSEKEY, 0644); @@ -127,7 +126,8 @@ namespace_open(struct
>>> namespace *ns)
>>> btree_set_cache_size(ns->data_db, ns->cache_size);
>>>
>>> - if (asprintf(&ns->indx_path, "%s/%s_indx.db", datadir,
>>> ns->suffix) == -1)
>>> + if (asprintf(&ns->indx_path, "%s/%s_indx.db",
>>> conf->datadir,
>>> + ns->suffix) == -1)
>>> return -1;
>>> ns->indx_db = btree_open(ns->indx_path, db_flags, 0644);
>>> if (ns->indx_db == NULL)
>>> blob - bad9bc630403e5280e3b0db41d8ec1247db70352
>>> blob + b72e4d89324b332498f8e5e0d1d8db822d4588f9
>>> --- usr.sbin/ldapd/parse.y
>>> +++ usr.sbin/ldapd/parse.y
>>> @@ -117,7 +117,7 @@ static struct namespace *current_ns = NULL;
>>> %}
>>>
>>> %token ERROR LISTEN ON TLS LDAPS PORT NAMESPACE ROOTDN
>>> ROOTPW INDEX -%token SECURE RELAX STRICT SCHEMA USE
>>> COMPRESSION LEVEL +%token SECURE RELAX STRICT SCHEMA USE
>>> COMPRESSION LEVEL DATADIR %token INCLUDE CERTIFICATE FSYNC
>>> CACHE_SIZE INDEX_CACHE_SIZE %token DENY ALLOW READ WRITE
>>> BIND ACCESS TO ROOT REFERRAL %token ANY CHILDREN OF
>>> ATTRIBUTE IN SUBTREE BY SELF @@ -225,6 +225,7 @@ conf_main :
>>> LISTEN ON STRING port ssl certname {
>>> normalize_dn(conf->rootdn); }
>>> | ROOTPW STRING {
>>> conf->rootpw = $2; }
>>> + | DATADIR STRING { conf->datadir =
>>> $2; } ;
>>>
>>> namespace : NAMESPACE STRING '{' '\n' {
>>> @@ -441,6 +442,7 @@ lookup(char *s)
>>> { "certificate", CERTIFICATE },
>>> { "children", CHILDREN },
>>> { "compression", COMPRESSION },
>>> + { "datadir", DATADIR },
>>> { "deny", DENY },
>>> { "fsync", FSYNC },
>>> { "in", IN },
>>>
>