diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-03-01 21:46:15 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-03-01 21:47:38 +0800 |
commit | ab5eb9b1a6026dbdc9d9259934b85170422c1538 (patch) | |
tree | 862b4dc5a38c333de5617fd74ec6a7d301007029 /modules/pam_mkhomedir | |
parent | 5cb97aee88271dfd25c20629052b3d89f05e63c2 (diff) | |
download | pam-dev.tar.gz pam-dev.tar.bz2 pam-dev.zip |
HALF WORK: MAX_PATHdev
Diffstat (limited to 'modules/pam_mkhomedir')
-rw-r--r-- | modules/pam_mkhomedir/mkhomedir_helper.c | 47 | ||||
-rw-r--r-- | modules/pam_mkhomedir/tst-pam_mkhomedir-retval.c | 8 |
2 files changed, 14 insertions, 41 deletions
diff --git a/modules/pam_mkhomedir/mkhomedir_helper.c b/modules/pam_mkhomedir/mkhomedir_helper.c index eefb5999..3b8ea454 100644 --- a/modules/pam_mkhomedir/mkhomedir_helper.c +++ b/modules/pam_mkhomedir/mkhomedir_helper.c @@ -9,6 +9,7 @@ */ #include "config.h" +#include "pam_inline.h" #include <stdarg.h> #include <sys/types.h> @@ -121,38 +122,11 @@ copy_entry(struct dir_spec *parent, const struct passwd *pwd, mode_t dir_mode, /* If it's a symlink, create a new link. */ if (S_ISLNK(st.st_mode)) { - int pointedlen = 0; -#ifndef PATH_MAX - char *pointed = NULL; - { - int size = 100; - - while (1) - { - pointed = malloc(size); - if (pointed == NULL) - { - retval = PAM_BUF_ERR; - goto go_out; - } - pointedlen = readlink(newsource, pointed, size); - if (pointedlen < 0) break; - if (pointedlen < size) break; - free(pointed); - size *= 2; - } - } - if (pointedlen < 0) - free(pointed); - else - pointed[pointedlen] = 0; -#else - char pointed[PATH_MAX] = {}; + char *pointed; - pointedlen = readlink(newsource, pointed, sizeof(pointed) - 1); -#endif + pointed = xreadlink(newsource); - if (pointedlen >= 0) + if (pointed) { if (symlinkat(pointed, parent->fd, dent->d_name) != 0) { @@ -161,9 +135,8 @@ copy_entry(struct dir_spec *parent, const struct passwd *pwd, mode_t dir_mode, if (retval != PAM_SUCCESS) pam_syslog(NULL, LOG_DEBUG, "unable to create link %s/%s: %m", parent->path, dent->d_name); -#ifndef PATH_MAX - free(pointed); -#endif + + free(pointed); goto go_out; } @@ -173,15 +146,11 @@ copy_entry(struct dir_spec *parent, const struct passwd *pwd, mode_t dir_mode, pam_syslog(NULL, LOG_DEBUG, "unable to change perms on link %s/%s: %m", parent->path, dent->d_name); -#ifndef PATH_MAX - free(pointed); -#endif retval = PAM_PERM_DENIED; + free(pointed); goto go_out; } -#ifndef PATH_MAX - free(pointed); -#endif + free(pointed); } retval = PAM_SUCCESS; goto go_out; diff --git a/modules/pam_mkhomedir/tst-pam_mkhomedir-retval.c b/modules/pam_mkhomedir/tst-pam_mkhomedir-retval.c index 282c5cd0..0d7b0a4b 100644 --- a/modules/pam_mkhomedir/tst-pam_mkhomedir-retval.c +++ b/modules/pam_mkhomedir/tst-pam_mkhomedir-retval.c @@ -5,6 +5,7 @@ */ #include "test_assert.h" +#include "pam_inline.h" #include <fcntl.h> #include <limits.h> @@ -30,9 +31,10 @@ main(void) FILE *fp; struct passwd *pw; struct stat st; - char cwd[PATH_MAX]; + char *cwd; - ASSERT_NE(NULL, getcwd(cwd, sizeof(cwd))); + cwd = xgetcwd(); + ASSERT_NE(NULL, cwd); /* PAM_USER_UNKNOWN */ ASSERT_NE(NULL, fp = fopen(service_file, "w")); @@ -106,5 +108,7 @@ main(void) ASSERT_EQ(0, unlink(service_file)); + free(cwd); + return 0; } |