Don't call dlopen(3) for built-in NSS types - "cache", "compat",

"dns", "files", "db", and "nis". It saves some path lookups during
binary startup.

Reviewed by:	markj
Approved by:	re (gjb, kib)
MFC after:	2 weeks
Sponsored by:	DARPA, AFRL
Differential Revision:	https://reviews.freebsd.org/D17557
This commit is contained in:
trasz 2018-10-15 17:50:02 +00:00
parent 118dce4d6b
commit d03a843143
2 changed files with 14 additions and 7 deletions

View File

@ -32,7 +32,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd April 4, 2010
.Dd October 15, 2018
.Dt NSDISPATCH 3
.Os
.Sh NAME
@ -112,10 +112,7 @@ which case they are selected using the
and
.Fa method_name
arguments along with the configured source.
(The methods supplied via
.Fa dtab
take priority over those implemented in NSS modules in the event
of a conflict.)
Modules must use source names different from the built-in ones.
.Pp
.Va defaults
contains a list of default sources to try if

View File

@ -486,9 +486,19 @@ nss_load_module(const char *source, nss_module_register_fn reg_fn)
*/
mod.handle = nss_builtin_handle;
fn = reg_fn;
} else if (!is_dynamic())
} else if (!is_dynamic()) {
goto fin;
else {
} else if (strcmp(source, NSSRC_CACHE) == 0 ||
strcmp(source, NSSRC_COMPAT) == 0 ||
strcmp(source, NSSRC_DB) == 0 ||
strcmp(source, NSSRC_DNS) == 0 ||
strcmp(source, NSSRC_FILES) == 0 ||
strcmp(source, NSSRC_NIS) == 0) {
/*
* Avoid calling dlopen(3) for built-in modules.
*/
goto fin;
} else {
if (snprintf(buf, sizeof(buf), "nss_%s.so.%d", mod.name,
NSS_MODULE_INTERFACE_VERSION) >= (int)sizeof(buf))
goto fin;