X-Git-Url: https://git.cameronkatri.com/pw-darwin.git/blobdiff_plain/406891bd852b21f4a6469bac735795902e2893dc..6a151c16645f90b21f171a44661b109f06e9097e:/pw/pwupd.c?ds=inline diff --git a/pw/pwupd.c b/pw/pwupd.c index baaf102..84226a9 100644 --- a/pw/pwupd.c +++ b/pw/pwupd.c @@ -43,6 +43,7 @@ static const char rcsid[] = #include "pwupd.h" #define HAVE_PWDB_C 1 +#define HAVE_PWDB_U 1 static char pathpwd[] = _PATH_PWD; static char * pwpath = pathpwd; @@ -110,7 +111,8 @@ fmtpwentry(char *buf, struct passwd * pwd, int type) int l; char *pw; - pw = (pwd->pw_passwd == NULL || !*pwd->pw_passwd) ? "" : (type == PWF_MASTER) ? pwd->pw_passwd : "*"; + pw = (type == PWF_MASTER) ? + ((pwd->pw_passwd == NULL) ? "" : pwd->pw_passwd) : "*"; if (type == PWF_PASSWD) l = sprintf(buf, "%s:*:%ld:%ld:%s:%s:%s\n", @@ -150,9 +152,12 @@ pw_update(struct passwd * pwd, char const * user, int mode) #else { /* No -C */ #endif - char pfx[32]; + char pfx[PWBUFSZ]; char pwbuf[PWBUFSZ]; - int l = sprintf(pfx, "%s:", user); + int l = snprintf(pfx, PWBUFSZ, "%s:", user); +#ifdef HAVE_PWDB_U + int isrename = pwd!=NULL && strcmp(user, pwd->pw_name); +#endif /* * Update the passwd file first @@ -162,6 +167,8 @@ pw_update(struct passwd * pwd, char const * user, int mode) else fmtpwentry(pwbuf, pwd, PWF_PASSWD); + if (l < 0) + l = 0; rc = fileupdate(getpwpath(_PASSWD), 0644, pwbuf, pfx, l, mode); if (rc == 0) { @@ -170,12 +177,16 @@ pw_update(struct passwd * pwd, char const * user, int mode) */ if (pwd != NULL) fmtpwentry(pwbuf, pwd, PWF_MASTER); - rc = fileupdate(getpwpath(_MASTERPASSWD), 0644, pwbuf, pfx, l, mode); - if (rc != 0) { - if (mode == UPD_DELETE) + rc = fileupdate(getpwpath(_MASTERPASSWD), 0600, pwbuf, pfx, l, mode); + if (rc == 0) { +#ifdef HAVE_PWDB_U + if (mode == UPD_DELETE || isrename) +#endif rc = pwdb(NULL); +#ifdef HAVE_PWDB_U else rc = pwdb("-u", user, NULL); +#endif } } }