diff options
author | Pino Toscano <toscano.pino@tiscali.it> | 2023-05-12 06:38:54 +0200 |
---|---|---|
committer | Dmitry V. Levin <ldv@strace.io> | 2023-05-12 04:49:01 +0000 |
commit | 2d121ac1285958f4d9502d5b078af814b120dd3d (patch) | |
tree | 2acb504c68dc09b82b663ff3933c744450e77946 /modules/pam_mkhomedir/mkhomedir_helper.c | |
parent | bcd540496d3fc1af59c129a508d22e235990e041 (diff) | |
download | pam-2d121ac1285958f4d9502d5b078af814b120dd3d.tar.gz pam-2d121ac1285958f4d9502d5b078af814b120dd3d.tar.bz2 pam-2d121ac1285958f4d9502d5b078af814b120dd3d.zip |
pam_mkhomedir: simplify handling of newsource/newdest
To support OSes without PATH_MAX (which is optional in POSIX), there are
two code paths for the 'newsource' and 'newdest' variables: one using
a PATH_MAX-sized stack buffer, and one using heap allocation. The second
is even more complicated than needed, doing manual calculations and
allocations.
To simplify the code a bit more, easing its maintenance, unify the two
using asprintf() to allocate 'newsource' and 'newdest': the extra
allocation needed should not be an issue, since this code runs in a
separate helper executable.
As additional change for this simplification, remove the reset to the
two variables to NULL right after their free(), which is not needed
since their scopes end.
Diffstat (limited to 'modules/pam_mkhomedir/mkhomedir_helper.c')
-rw-r--r-- | modules/pam_mkhomedir/mkhomedir_helper.c | 117 |
1 files changed, 32 insertions, 85 deletions
diff --git a/modules/pam_mkhomedir/mkhomedir_helper.c b/modules/pam_mkhomedir/mkhomedir_helper.c index 3213f028..1d18ee88 100644 --- a/modules/pam_mkhomedir/mkhomedir_helper.c +++ b/modules/pam_mkhomedir/mkhomedir_helper.c @@ -69,14 +69,7 @@ create_homedir(const struct passwd *pwd, int destfd; int res; struct stat st; -#ifndef PATH_MAX char *newsource = NULL, *newdest = NULL; - /* track length of buffers */ - int nslen = 0, ndlen = 0; - int slen = strlen(source), dlen = strlen(dest); -#else - char newsource[PATH_MAX], newdest[PATH_MAX]; -#endif /* Skip some files.. */ if (strcmp(dent->d_name,".") == 0 || @@ -84,69 +77,37 @@ create_homedir(const struct passwd *pwd, continue; /* Determine what kind of file it is. */ -#ifndef PATH_MAX - nslen = slen + strlen(dent->d_name) + 2; - - if (nslen <= 0) - { - retval = PAM_BUF_ERR; - goto go_out; - } - - if ((newsource = malloc(nslen)) == NULL) - { - retval = PAM_BUF_ERR; - goto go_out; - } - - sprintf(newsource, "%s/%s", source, dent->d_name); -#else - snprintf(newsource, sizeof(newsource), "%s/%s", source, dent->d_name); -#endif + if (asprintf(&newsource, "%s/%s", source, dent->d_name) < 0) + { + pam_syslog(NULL, LOG_CRIT, "asprintf failed for 'newsource'"); + retval = PAM_BUF_ERR; + goto go_out; + } if (lstat(newsource, &st) != 0) -#ifndef PATH_MAX { - free(newsource); - newsource = NULL; + free(newsource); continue; } -#else - continue; -#endif /* We'll need the new file's name. */ -#ifndef PATH_MAX - ndlen = dlen + strlen(dent->d_name)+2; - - if (ndlen <= 0) - { - retval = PAM_BUF_ERR; - goto go_out; - } - - if ((newdest = malloc(ndlen)) == NULL) - { - free (newsource); - retval = PAM_BUF_ERR; - goto go_out; - } + if (asprintf(&newdest, "%s/%s", dest, dent->d_name) < 0) + { + pam_syslog(NULL, LOG_CRIT, "asprintf failed for 'newdest'"); + free(newsource); + retval = PAM_BUF_ERR; + goto go_out; + } - sprintf (newdest, "%s/%s", dest, dent->d_name); -#else - snprintf (newdest, sizeof (newdest), "%s/%s", dest, dent->d_name); -#endif /* If it's a directory, recurse. */ if (S_ISDIR(st.st_mode)) { retval = create_homedir(pwd, newsource, newdest); -#ifndef PATH_MAX - free(newsource); newsource = NULL; - free(newdest); newdest = NULL; -#endif + free(newsource); + free(newdest); if (retval != PAM_SUCCESS) { @@ -199,9 +160,9 @@ create_homedir(const struct passwd *pwd, closedir(d); #ifndef PATH_MAX free(pointed); - free(newsource); - free(newdest); #endif + free(newsource); + free(newdest); return PAM_PERM_DENIED; } } @@ -209,10 +170,8 @@ create_homedir(const struct passwd *pwd, free(pointed); #endif } -#ifndef PATH_MAX - free(newsource); newsource = NULL; - free(newdest); newdest = NULL; -#endif + free(newsource); + free(newdest); continue; } @@ -220,10 +179,8 @@ create_homedir(const struct passwd *pwd, * the new device node, FIFO, or whatever it is. */ if (!S_ISREG(st.st_mode)) { -#ifndef PATH_MAX - free(newsource); newsource = NULL; - free(newdest); newdest = NULL; -#endif + free(newsource); + free(newdest); continue; } @@ -236,10 +193,8 @@ create_homedir(const struct passwd *pwd, close(srcfd); closedir(d); -#ifndef PATH_MAX - free(newsource); newsource = NULL; - free(newdest); newdest = NULL; -#endif + free(newsource); + free(newdest); return PAM_PERM_DENIED; } @@ -252,10 +207,8 @@ create_homedir(const struct passwd *pwd, close(srcfd); closedir(d); -#ifndef PATH_MAX - free(newsource); newsource = NULL; - free(newdest); newdest = NULL; -#endif + free(newsource); + free(newdest); return PAM_PERM_DENIED; } @@ -271,10 +224,8 @@ create_homedir(const struct passwd *pwd, close(destfd); closedir(d); -#ifndef PATH_MAX - free(newsource); newsource = NULL; - free(newdest); newdest = NULL; -#endif + free(newsource); + free(newdest); return PAM_PERM_DENIED; } @@ -299,10 +250,8 @@ create_homedir(const struct passwd *pwd, close(destfd); closedir(d); -#ifndef PATH_MAX - free(newsource); newsource = NULL; - free(newdest); newdest = NULL; -#endif + free(newsource); + free(newdest); return PAM_PERM_DENIED; } @@ -310,10 +259,8 @@ create_homedir(const struct passwd *pwd, close(srcfd); close(destfd); -#ifndef PATH_MAX - free(newsource); newsource = NULL; - free(newdest); newdest = NULL; -#endif + free(newsource); + free(newdest); } closedir(d); |