summaryrefslogtreecommitdiffstats
path: root/chpass
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2003-04-09 18:18:42 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2003-04-09 18:18:42 +0000
commit5fb7a5cf13a3b79edf8673d5db8bf7e8d5e64030 (patch)
tree7c23a1a594ae3a6f19e540f2fdaab3667661070e /chpass
parente3302030b6df520e4355d5397d6b08b33979f5ee (diff)
downloadpw-darwin-5fb7a5cf13a3b79edf8673d5db8bf7e8d5e64030.tar.gz
pw-darwin-5fb7a5cf13a3b79edf8673d5db8bf7e8d5e64030.tar.zst
pw-darwin-5fb7a5cf13a3b79edf8673d5db8bf7e8d5e64030.zip
Avoid clobbering the gecos field, as we intend to use the original later.
PR: bin/50563
Diffstat (limited to 'chpass')
-rw-r--r--chpass/edit.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/chpass/edit.c b/chpass/edit.c
index 59646f0..ce82f8e 100644
--- a/chpass/edit.c
+++ b/chpass/edit.c
@@ -109,7 +109,7 @@ static int
display(const char *tfn, struct passwd *pw)
{
FILE *fp;
- char *bp, *p;
+ char *bp, *gecos, *p;
if ((fp = fopen(tfn, "w")) == NULL) {
warn("%s", tfn);
@@ -151,8 +151,13 @@ display(const char *tfn, struct passwd *pw)
(void)fprintf(fp, "Shell: %s\n",
*pw->pw_shell ? pw->pw_shell : _PATH_BSHELL);
else
- list[E_SHELL].restricted = 1;
- bp = pw->pw_gecos;
+ list[E_SHELL].restricted = 1;
+
+ if ((bp = gecos = strdup(pw->pw_gecos)) == NULL) {
+ warn(NULL);
+ fclose(fp);
+ return (-1);
+ }
p = strsep(&bp, ",");
p = strdup(p ? p : "");
@@ -183,6 +188,8 @@ display(const char *tfn, struct passwd *pw)
if (!list[E_OTHER].restricted || master_mode)
(void)fprintf(fp, "Other information: %s\n", bp);
+ free(gecos);
+
(void)fchown(fileno(fp), getuid(), getgid());
(void)fclose(fp);
return (0);