Use fdlopen(3) if it is available.

git-svn-id: svn+ssh://svn.openpam.org/svn/openpam/trunk@516 185d5e19-27fe-0310-9dcf-9bff6b9f3609
This commit is contained in:
Dag-Erling Smørgrav 2012-01-10 21:26:34 +00:00
parent 8f8a8584fc
commit 8c2f4c74b7
1 changed files with 34 additions and 2 deletions

View File

@ -40,6 +40,7 @@
#endif
#include <dlfcn.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
@ -60,14 +61,44 @@
* Perform sanity checks and attempt to load a module
*/
#ifdef HAVE_FDLOPEN
static void *
try_dlopen(const char *modfn)
{
void *dlh;
int fd;
if ((fd = open(modfn, O_RDONLY)) < 0)
return (NULL);
if (openpam_check_desc_owner_perms(modfn, fd) != 0) {
close(fd);
return (NULL);
}
if ((dlh = fdlopen(fd, RTLD_NOW)) == NULL) {
openpam_log(PAM_LOG_ERROR, "%s: %s", modfn, dlerror());
close(fd);
errno = 0;
return (NULL);
}
close(fd);
return (dlh);
}
#else
static void *
try_dlopen(const char *modfn)
{
void *dlh;
if (openpam_check_path_owner_perms(modfn) != 0)
return (NULL);
return (dlopen(modfn, RTLD_NOW));
if ((dlh = dlopen(modfn, RTLD_NOW)) == NULL) {
openpam_log(PAM_LOG_ERROR, "%s: %s", modfn, dlerror());
errno = 0;
return (NULL);
}
return (dlh);
}
#endif
/*
* OpenPAM internal
@ -124,7 +155,8 @@ buf_err:
dlclose(dlh);
FREE(module);
err:
openpam_log(PAM_LOG_ERROR, "%m");
if (errno != 0)
openpam_log(PAM_LOG_ERROR, "%s: %m", path);
return (NULL);
}