diff options
author | Tobias Stoeckmann <tobias@stoeckmann.org> | 2023-11-12 17:41:49 +0100 |
---|---|---|
committer | Dmitry V. Levin <ldv@strace.io> | 2023-11-29 15:40:53 +0000 |
commit | a5e132e5af2a1b5ece95c1f66e398cdeea10ceff (patch) | |
tree | 2002ef3049b25867268d39e7e3a025dcb16acad7 /modules/pam_mkhomedir | |
parent | ea53ebbd05ea695bca0130a882f89ea831284c36 (diff) | |
download | pam-a5e132e5af2a1b5ece95c1f66e398cdeea10ceff.tar.gz pam-a5e132e5af2a1b5ece95c1f66e398cdeea10ceff.tar.bz2 pam-a5e132e5af2a1b5ece95c1f66e398cdeea10ceff.zip |
pam_mkhomedir: return error if link creation fails
Treat symlink creation failures the same way as failures when
creating files and directories.
Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
Diffstat (limited to 'modules/pam_mkhomedir')
-rw-r--r-- | modules/pam_mkhomedir/mkhomedir_helper.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/modules/pam_mkhomedir/mkhomedir_helper.c b/modules/pam_mkhomedir/mkhomedir_helper.c index 36d9502e..fd7708bb 100644 --- a/modules/pam_mkhomedir/mkhomedir_helper.c +++ b/modules/pam_mkhomedir/mkhomedir_helper.c @@ -151,21 +151,32 @@ create_homedir(const struct passwd *pwd, mode_t dir_mode, #endif if (pointedlen >= 0) { - if(symlink(pointed, newdest) == 0) + if(symlink(pointed, newdest) != 0) { - if (lchown(newdest, pwd->pw_uid, pwd->pw_gid) != 0) - { - pam_syslog(NULL, LOG_DEBUG, - "unable to change perms on link %s: %m", newdest); - closedir(d); + pam_syslog(NULL, LOG_DEBUG, + "unable to create link %s: %m", newdest); + closedir(d); #ifndef PATH_MAX - free(pointed); + free(pointed); +#endif + free(newsource); + free(newdest); + retval = PAM_PERM_DENIED; + goto go_out; + } + + if (lchown(newdest, pwd->pw_uid, pwd->pw_gid) != 0) + { + pam_syslog(NULL, LOG_DEBUG, + "unable to change perms on link %s: %m", newdest); + closedir(d); +#ifndef PATH_MAX + free(pointed); #endif - free(newsource); - free(newdest); - retval = PAM_PERM_DENIED; - goto go_out; - } + free(newsource); + free(newdest); + retval = PAM_PERM_DENIED; + goto go_out; } #ifndef PATH_MAX free(pointed); |