- dlopen(3) errors should be printed with dlerror(3) so we get the reason the
module link failed, instead of printing "Undefined error 0". - don't print free'd variable on error, restructure so that we free at the end and print the consistent name of the path dlopened.
This commit is contained in:
parent
f46231caba
commit
0730293fd3
49
external/bsd/openpam/dist/lib/openpam_dynamic.c
vendored
49
external/bsd/openpam/dist/lib/openpam_dynamic.c
vendored
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: openpam_dynamic.c,v 1.4 2012/08/15 06:16:41 christos Exp $ */
|
||||
/* $NetBSD: openpam_dynamic.c,v 1.5 2013/02/05 23:47:42 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2002-2003 Networks Associates Technology, Inc.
|
||||
@ -63,12 +63,14 @@
|
||||
*/
|
||||
|
||||
static void *
|
||||
try_dlopen(const char *modfn)
|
||||
try_dlopen(const char *modfn, int *error)
|
||||
{
|
||||
|
||||
if (openpam_check_path_owner_perms(modfn) != 0)
|
||||
return (NULL);
|
||||
return (dlopen(modfn, RTLD_NOW));
|
||||
if (openpam_check_path_owner_perms(modfn) != 0) {
|
||||
*error = errno;
|
||||
return NULL;
|
||||
}
|
||||
*error = 0;
|
||||
return dlopen(modfn, RTLD_NOW);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -82,12 +84,13 @@ openpam_dynamic(const char *path)
|
||||
{
|
||||
const pam_module_t *dlmodule;
|
||||
pam_module_t *module;
|
||||
const char *prefix, *epath = path;
|
||||
const char *prefix;
|
||||
char *vpath;
|
||||
void *dlh;
|
||||
int i, serrno;
|
||||
|
||||
dlh = NULL;
|
||||
module = NULL;
|
||||
|
||||
/* Prepend the standard prefix if not an absolute pathname. */
|
||||
if (path[0] != '/')
|
||||
@ -98,16 +101,18 @@ openpam_dynamic(const char *path)
|
||||
/* try versioned module first, then unversioned module */
|
||||
if (asprintf(&vpath, "%s/%s.%d", prefix, path, LIB_MAJ) < 0)
|
||||
goto err;
|
||||
epath = vpath;
|
||||
if ((dlh = try_dlopen(vpath)) == NULL && errno == ENOENT) {
|
||||
if ((dlh = try_dlopen(vpath, &serrno)) == NULL && errno == ENOENT) {
|
||||
*strrchr(vpath, '.') = '\0';
|
||||
dlh = try_dlopen(vpath);
|
||||
dlh = try_dlopen(vpath, &serrno);
|
||||
}
|
||||
if (dlh == NULL) {
|
||||
if (serrno == 0)
|
||||
goto dl_err;
|
||||
else {
|
||||
errno = serrno;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
serrno = errno;
|
||||
FREE(vpath);
|
||||
errno = serrno;
|
||||
if (dlh == NULL)
|
||||
goto err;
|
||||
if ((module = calloc((size_t)1, sizeof *module)) == NULL)
|
||||
goto buf_err;
|
||||
if ((module->path = strdup(path)) == NULL)
|
||||
@ -119,9 +124,10 @@ openpam_dynamic(const char *path)
|
||||
(pam_func_t)dlsym(dlh, pam_sm_func_name[i]);
|
||||
if (module->func[i] == NULL)
|
||||
openpam_log(PAM_LOG_DEBUG, "%s: %s(): %s",
|
||||
path, pam_sm_func_name[i], dlerror());
|
||||
vpath, pam_sm_func_name[i], dlerror());
|
||||
}
|
||||
return (module);
|
||||
free(vpath);
|
||||
return module;
|
||||
buf_err:
|
||||
serrno = errno;
|
||||
if (dlh != NULL)
|
||||
@ -130,8 +136,13 @@ buf_err:
|
||||
errno = serrno;
|
||||
err:
|
||||
openpam_log(errno == ENOENT ? PAM_LOG_DEBUG : PAM_LOG_ERROR, "%s: %s",
|
||||
epath, strerror(errno));
|
||||
return (NULL);
|
||||
vpath, strerror(errno));
|
||||
free(vpath);
|
||||
return NULL;
|
||||
dl_err:
|
||||
openpam_log(PAM_LOG_ERROR, "%s: %s", vpath, dlerror());
|
||||
free(vpath);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user