summaryrefslogtreecommitdiff
path: root/modules/pam_mkhomedir
diff options
context:
space:
mode:
authorThorsten Kukuk <kukuk@thkukuk.de>2004-09-22 09:37:46 +0000
committerThorsten Kukuk <kukuk@thkukuk.de>2004-09-22 09:37:46 +0000
commit6e99aa00d23a68650fdd4fae01aab812dcfe10eb (patch)
tree0b929b30fa38ed1d402515fbf9d7d8cf6dcb5284 /modules/pam_mkhomedir
parente1f75a80821125170e23a9b920d138a4a952c708 (diff)
Relevant BUGIDs:
Purpose of commit: Commit summary: --------------- bugfix: Add rest of Steve Grubb's resource leak and other fixes
Diffstat (limited to 'modules/pam_mkhomedir')
-rw-r--r--modules/pam_mkhomedir/pam_mkhomedir.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/modules/pam_mkhomedir/pam_mkhomedir.c b/modules/pam_mkhomedir/pam_mkhomedir.c
index c6d49301..342637c1 100644
--- a/modules/pam_mkhomedir/pam_mkhomedir.c
+++ b/modules/pam_mkhomedir/pam_mkhomedir.c
@@ -111,7 +111,7 @@ static int converse(pam_handle_t * pamh, int ctrl, int nargs
D(("begin to converse"));
retval = pam_get_item(pamh, PAM_CONV, (const void **) &conv);
- if (retval == PAM_SUCCESS)
+ if (retval == PAM_SUCCESS && conv)
{
retval = conv->conv(nargs, (const struct pam_message **) message
@@ -130,6 +130,8 @@ static int converse(pam_handle_t * pamh, int ctrl, int nargs
{
_log_err(LOG_ERR, "couldn't obtain coversation function [%s]"
,pam_strerror(pamh, retval));
+ if (retval == PAM_SUCCESS)
+ retval = PAM_BAD_ITEM; /* conv was NULL */
}
D(("ready to return from module conversation"));
@@ -235,7 +237,11 @@ static int create_homedir(pam_handle_t * pamh, int ctrl,
/* If it's a directory, recurse. */
if (S_ISDIR(St.st_mode))
{
- create_homedir(pamh, ctrl, pwd, newsource, newdest);
+ int retval = create_homedir(pamh, ctrl, pwd, newsource, newdest);
+ if (retval != PAM_SUCCESS) {
+ closedir(D);
+ return retval;
+ }
continue;
}
@@ -250,6 +256,7 @@ static int create_homedir(pam_handle_t * pamh, int ctrl,
{
if (lchown(newdest,pwd->pw_uid,pwd->pw_gid) != 0)
{
+ closedir(D);
_log_err(LOG_DEBUG, "unable to chang perms on link %s",
newdest);
return PAM_PERM_DENIED;
@@ -269,6 +276,7 @@ static int create_homedir(pam_handle_t * pamh, int ctrl,
/* Open the source file */
if ((SrcFd = open(newsource,O_RDONLY)) < 0 || fstat(SrcFd,&St) != 0)
{
+ closedir(D);
_log_err(LOG_DEBUG, "unable to open src file %s",newsource);
return PAM_PERM_DENIED;
}
@@ -278,6 +286,7 @@ static int create_homedir(pam_handle_t * pamh, int ctrl,
if ((DestFd = open(newdest,O_WRONLY | O_TRUNC | O_CREAT,0600)) < 0)
{
close(SrcFd);
+ closedir(D);
_log_err(LOG_DEBUG, "unable to open dest file %s",newdest);
return PAM_PERM_DENIED;
}
@@ -290,6 +299,7 @@ static int create_homedir(pam_handle_t * pamh, int ctrl,
{
close(SrcFd);
close(DestFd);
+ closedir(D);
_log_err(LOG_DEBUG, "unable to chang perms on copy %s",newdest);
return PAM_PERM_DENIED;
}
@@ -297,19 +307,29 @@ static int create_homedir(pam_handle_t * pamh, int ctrl,
/* Copy the file */
do
{
- Res = read(SrcFd,remark,sizeof(remark));
- if (Res < 0 || write(DestFd,remark,Res) != Res)
- {
- close(SrcFd);
- close(DestFd);
- _log_err(LOG_DEBUG, "unable to perform IO");
- return PAM_PERM_DENIED;
+ Res = _pammodutil_read(SrcFd,remark,sizeof(remark));
+
+ if (Res == 0)
+ continue;
+
+ if (Res > 0) {
+ if (_pammodutil_write(DestFd,remark,Res) == Res)
+ continue;
}
+
+ /* If we get here, pammodutil_read returned a -1 or
+ _pammodutil_write returned something unexpected. */
+ close(SrcFd);
+ close(DestFd);
+ closedir(D);
+ _log_err(LOG_DEBUG, "unable to perform IO");
+ return PAM_PERM_DENIED;
}
while (Res != 0);
close(SrcFd);
close(DestFd);
}
+ closedir(D);
return PAM_SUCCESS;
}