mirror of
git://git.gnu.org.ua/pam-modules.git
synced 2025-04-27 00:49:53 +03:00
Bugfixes.
* pam_ldaphome/pam_ldaphome.c (argcv_free): Fix multiple free
(argcv_concat): Fix overly conservative size calculation and
concatenation loop.
(parse_ldap_uri): Fix URI reconstruction.
(dir_copy_loop): Remove unused variable.
(store_pubkey): Return meaningful error code.
(import_public_key): Propagate return code from store_pubkey.
(create_home_dir): Return meaningful error code.
(pam_sm_authenticate): Propagate return code from create_home_dir
and import_public_key to the caller.
* pam_log/Makefile.am: Remove BUILD_PAM_LOG substitution
(complements 1a80b647
).
This commit is contained in:
parent
996f020583
commit
381fbf3365
2 changed files with 20 additions and 22 deletions
|
@ -72,8 +72,8 @@ argcv_free(int wc, char **wv)
|
|||
|
||||
for (i = 0; i < wc; i++) {
|
||||
free(wv[i]);
|
||||
free(wv);
|
||||
}
|
||||
free(wv);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -131,14 +131,13 @@ argcv_concat(int wc, char **wv)
|
|||
|
||||
for (i = 0; i < wc; i++)
|
||||
size += strlen(wv[i]) + 1;
|
||||
size++;
|
||||
res = malloc(size);
|
||||
if (!res)
|
||||
return 0;
|
||||
for (p = res, i = 0; ; i++) {
|
||||
for (p = res, i = 0;;) {
|
||||
strcpy(p, wv[i]);
|
||||
p += strlen(wv[i]);
|
||||
if (i < wc)
|
||||
if (++i < wc)
|
||||
*p++ = ' ';
|
||||
else
|
||||
break;
|
||||
|
@ -266,7 +265,7 @@ parse_ldap_uri(const char *uri)
|
|||
return NULL;
|
||||
} else if (!urls)
|
||||
return NULL;
|
||||
ldapuri = argcv_concat(wc, wv);
|
||||
ldapuri = argcv_concat(nurls, urls);
|
||||
if (!ldapuri)
|
||||
_pam_log(LOG_ERR, "%s", strerror(errno));
|
||||
ber_memvfree ((void **)urls);
|
||||
|
@ -882,7 +881,6 @@ dir_copy_loop(pam_handle_t *pamh, DIR *dir,
|
|||
char *buffer, size_t bufsize, struct passwd *pw)
|
||||
{
|
||||
struct dirent *ent;
|
||||
struct stat dir_st;
|
||||
|
||||
while ((ent = readdir(dir))) {
|
||||
char const *ename = ent->d_name;
|
||||
|
@ -1044,7 +1042,7 @@ populate_homedir(pam_handle_t *pamh, struct passwd *pw, struct gray_env *env)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
store_pubkey(const char *key, struct passwd *pw)
|
||||
{
|
||||
FILE *fp;
|
||||
|
@ -1053,6 +1051,7 @@ store_pubkey(const char *key, struct passwd *pw)
|
|||
int found = 0;
|
||||
char *file_name;
|
||||
size_t homelen, pathlen, len;
|
||||
int retval;
|
||||
|
||||
homelen = strlen(pw->pw_dir);
|
||||
pathlen = strlen(authorized_keys_file);
|
||||
|
@ -1072,7 +1071,7 @@ store_pubkey(const char *key, struct passwd *pw)
|
|||
_pam_log(LOG_EMERG, "cannot open file %s: %s",
|
||||
file_name, strerror(errno));
|
||||
free(file_name);
|
||||
return;
|
||||
return PAM_SERVICE_ERR;
|
||||
}
|
||||
free(file_name);
|
||||
fchown(fileno(fp), pw->pw_uid, pw->pw_gid);
|
||||
|
@ -1103,8 +1102,11 @@ store_pubkey(const char *key, struct passwd *pw)
|
|||
if (!found) {
|
||||
fwrite(key, strlen(key), 1, fp);
|
||||
fputc('\n', fp);
|
||||
}
|
||||
retval = PAM_TRY_AGAIN;
|
||||
} else
|
||||
retval = PAM_SUCCESS;
|
||||
fclose(fp);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1142,9 +1144,8 @@ import_public_key(pam_handle_t *pamh, struct passwd *pw, struct gray_env *env)
|
|||
|
||||
pubkey = ldap_search(ld, base, filter, attr);
|
||||
gray_slist_free(&slist);
|
||||
store_pubkey(pubkey, pw);
|
||||
retval = store_pubkey(pubkey, pw);
|
||||
free(pubkey);
|
||||
retval = PAM_SUCCESS;
|
||||
}
|
||||
ldap_unbind(ld);
|
||||
return retval;
|
||||
|
@ -1159,24 +1160,23 @@ create_home_dir(pam_handle_t *pamh, struct passwd *pw, struct gray_env *env)
|
|||
if (errno != ENOENT) {
|
||||
_pam_log(LOG_ERR, "cannot stat home directory %s: %s",
|
||||
pw->pw_dir, strerror(errno));
|
||||
return 1;
|
||||
return PAM_SERVICE_ERR;
|
||||
}
|
||||
/* FIXME: mode must be configurable */
|
||||
if (mkdir(pw->pw_dir, 0775)) {
|
||||
_pam_log(LOG_ERR, "cannot create %s: %s",
|
||||
pw->pw_dir, strerror(errno));
|
||||
return 1;
|
||||
return PAM_SERVICE_ERR;
|
||||
}
|
||||
populate_homedir(pamh, pw, env);
|
||||
chown(pw->pw_dir, pw->pw_uid, pw->pw_gid);
|
||||
} else if (!S_ISDIR(st.st_mode)) {
|
||||
_pam_log(LOG_ERR, "%s exists, but is not a directory",
|
||||
pw->pw_dir);
|
||||
return 1;
|
||||
return PAM_SERVICE_ERR;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
return PAM_SUCCESS;
|
||||
}
|
||||
|
||||
PAM_EXTERN int
|
||||
|
@ -1196,9 +1196,9 @@ pam_sm_authenticate(pam_handle_t *pamh,
|
|||
struct passwd *pw;
|
||||
|
||||
if (check_user_groups(pamh, env, &pw, &retval) == 0) {
|
||||
if (create_home_dir(pamh, pw, env) == 0 &&
|
||||
import_public_key(pamh, pw, env) == 0)
|
||||
retval = PAM_TRY_AGAIN;
|
||||
retval = create_home_dir(pamh, pw, env);
|
||||
if (retval == PAM_SUCCESS)
|
||||
retval = import_public_key(pamh, pw, env);
|
||||
}
|
||||
gray_env_free(env);
|
||||
}
|
||||
|
|
|
@ -14,9 +14,7 @@
|
|||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
pamdir=@PAMDIR@
|
||||
PAM_LOG = pam_log.la
|
||||
pam_LTLIBRARIES = @BUILD_PAM_LOG@
|
||||
EXTRA_LTLIBRARIES = pam_log.la
|
||||
pam_LTLIBRARIES = pam_log.la
|
||||
pam_log_la_SOURCES = pam_log.c
|
||||
AM_CPPFLAGS=-DMODULE_NAME=\"pam_log\" -DSYSCONFDIR=\"${sysconfdir}\"
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue