Anton spotted a doas regression failure in t-run-keepenv-path after the change to doas for LOGIN_SETALL. Since that test runs doas in a chroot and the setup does not create a login.conf, login_getclass in login_cap.c will return a login_cap_t with a NULL lc_cap (and errno set to ENOENT) on L133. setuserenv returns -1 if lc->lc_cap is NULL causing the "could not set user environment" failure.
As all the login_getcap* functions as well as gsetrl and setuserpath succeed on a missing login.conf, the below path changes setuserenv to return 0 as well. This matches what happens if the class has no setenv capability right below. The comment is taken from gsetrl. diff --git gen/login_cap.c gen/login_cap.c index 67933653349..c142c0a7503 100644 --- gen/login_cap.c +++ gen/login_cap.c @@ -700,8 +700,11 @@ setuserpath(login_cap_t *lc, const struct passwd *pwd) char *path = NULL, *opath = NULL, *op, *np; int len, error; + /* + * If we have no capabilities then set _PATH_DEFPATH. + */ if (lc->lc_cap == NULL) - goto setit; /* impossible */ + goto setit; if ((len = cgetustr(lc->lc_cap, "path", &opath)) <= 0) goto setit; @@ -753,8 +756,12 @@ setuserenv(login_cap_t *lc, const struct passwd *pwd) char *beg, *end, *ep, *list, *value; int len, error; + /* + * If we have no capabilities then there is nothing to do and + * we can just return success. + */ if (lc->lc_cap == NULL) - return (-1); /* impossible */ + return (0); if ((len = cgetustr(lc->lc_cap, "setenv", &list)) <= 0) return (0);