aboutsummaryrefslogtreecommitdiff
path: root/modules/pam_mkhomedir
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-03-01 21:46:15 +0800
committerYuqian Yang <crupest@crupest.life>2025-03-01 21:47:38 +0800
commitab5eb9b1a6026dbdc9d9259934b85170422c1538 (patch)
tree862b4dc5a38c333de5617fd74ec6a7d301007029 /modules/pam_mkhomedir
parent5cb97aee88271dfd25c20629052b3d89f05e63c2 (diff)
downloadpam-ab5eb9b1a6026dbdc9d9259934b85170422c1538.tar.gz
pam-ab5eb9b1a6026dbdc9d9259934b85170422c1538.tar.bz2
pam-ab5eb9b1a6026dbdc9d9259934b85170422c1538.zip
HALF WORK: MAX_PATHdev
Diffstat (limited to 'modules/pam_mkhomedir')
-rw-r--r--modules/pam_mkhomedir/mkhomedir_helper.c47
-rw-r--r--modules/pam_mkhomedir/tst-pam_mkhomedir-retval.c8
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;
}