aboutsummaryrefslogtreecommitdiff
path: root/modules/pam_mkhomedir
diff options
context:
space:
mode:
authorPino Toscano <toscano.pino@tiscali.it>2023-05-12 06:38:54 +0200
committerDmitry V. Levin <ldv@strace.io>2023-05-12 04:49:01 +0000
commit2d121ac1285958f4d9502d5b078af814b120dd3d (patch)
tree2acb504c68dc09b82b663ff3933c744450e77946 /modules/pam_mkhomedir
parentbcd540496d3fc1af59c129a508d22e235990e041 (diff)
downloadpam-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')
-rw-r--r--modules/pam_mkhomedir/mkhomedir_helper.c117
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);