> "If the certificate name is an absolute path, a .crt and .key
> extension are appended to form the certificate path and key path
> respectively."
> This part does not seem to work at all.
> Neither it tries to search certificates using the absolute path nor
> it tries to append .crt or .key extension to the absolute path when no
> extension is used in config.
> 
> Or I do it completely wrong?

It's a bug. If the certificate path is absolute, faulty short-circuiting
logic would result in first correctly appending ".crt" to the path, then
incorrectly prepending "/etc/ldap/cert".

You can see the problem with a config containing

        listen on lo0 port 6636 tls certificate "/bogus/lo0"

$ ldapd -vv -f ldapd.conf -n
...
loading certificate file /etc/ldap/certs//bogus/lo0.crt
ldapd.conf:5: cannot load certificate: /bogus/lo0
...

The diff below avoids calling bsnprintf() twice for an absolute
certificate path.

Index: parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/ldapd/parse.y,v
retrieving revision 1.36
diff -u -p -r1.36 parse.y
--- parse.y     24 Jun 2020 07:20:47 -0000      1.36
+++ parse.y     28 Nov 2020 21:40:13 -0000
@@ -1281,8 +1281,9 @@ load_certfile(struct ldapd_config *env, 
 
        if ((name[0] == '/' &&
             !bsnprintf(certfile, sizeof(certfile), "%s.crt", name)) ||
-           !bsnprintf(certfile, sizeof(certfile), "/etc/ldap/certs/%s.crt",
-               name)) {
+           (name[0] != '/' &&
+            !bsnprintf(certfile, sizeof(certfile), "/etc/ldap/certs/%s.crt",
+               name))) {
                log_warn("load_certfile: path truncated");
                goto err;
        }
@@ -1300,8 +1301,9 @@ load_certfile(struct ldapd_config *env, 
 
        if ((name[0] == '/' &&
             !bsnprintf(certfile, sizeof(certfile), "%s.key", name)) ||
-           !bsnprintf(certfile, sizeof(certfile), "/etc/ldap/certs/%s.key",
-               name)) {
+           (name[0] != '/' &&
+            !bsnprintf(certfile, sizeof(certfile), "/etc/ldap/certs/%s.key",
+               name))) {
                log_warn("load_certfile: path truncated");
                goto err;
        }

Reply via email to