getnewyppasswd() in yp_passwd.c doesn't generate correct encrypted
password strings when DES isn't used; somehow the encrypted password is corrupted and it winds up containing control chars, which yppasswdd subsequently rejects. This breaks yppasswd on non-DES FreeBSD systems using NIS. Fix: scrap getnewyppasswd() entirely and use getnewpasswd() from local_password.c, since it already works properly and is virtually identical to getnewyppasswd() anyway. (Wish I'd noticed this sooner.) This fixes a problem just reported on comp.unix.bsd.freebsd.misc.
This commit is contained in:
parent
2f22cc074c
commit
a7aa6bd1ea
@ -50,47 +50,7 @@ uid_t uid;
|
|||||||
static unsigned char itoa64[] = /* 0 ... 63 => ascii - 64 */
|
static unsigned char itoa64[] = /* 0 ... 63 => ascii - 64 */
|
||||||
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||||
|
|
||||||
char *getnewyppasswd(struct passwd *);
|
extern char *getnewpasswd __P(( struct passwd * ));
|
||||||
|
|
||||||
char *
|
|
||||||
getnewyppasswd(register struct passwd *pw)
|
|
||||||
{
|
|
||||||
char *buf;
|
|
||||||
char salt[9], *p=NULL;
|
|
||||||
int tries = 0;
|
|
||||||
|
|
||||||
buf = (char *) malloc(30);
|
|
||||||
|
|
||||||
printf("Changing YP password for %s.\n", pw->pw_name);
|
|
||||||
|
|
||||||
buf[0] = '\0';
|
|
||||||
while(1) {
|
|
||||||
p = getpass("Please enter new password:");
|
|
||||||
if(*p == '\0') {
|
|
||||||
printf("Password unchanged.\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#ifndef DEBUG
|
|
||||||
if (strlen(p) <= 5 && (uid != 0 || ++tries < 2)) {
|
|
||||||
printf("Please enter a longer password.\n");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
strcpy(buf, p);
|
|
||||||
p = getpass("Please retype new password:");
|
|
||||||
if( strcmp(buf, p) == 0) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
printf("Mismatch - password unchanged.\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* grab a random printable character that isn't a colon */
|
|
||||||
srandom((int)time((time_t *)NULL));
|
|
||||||
to64(&salt[0], random(), 2);
|
|
||||||
return strdup(crypt(buf, salt));
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
char *
|
||||||
getfield(char *gecos, char *field, int size)
|
getfield(char *gecos, char *field, int size)
|
||||||
@ -303,7 +263,7 @@ yp_passwd(char *user)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (use_yp_passwd) {
|
if (use_yp_passwd) {
|
||||||
if ((s = getnewyppasswd(pw)) == NULL)
|
if ((s = getnewpasswd(pw)) == NULL)
|
||||||
exit (1);
|
exit (1);
|
||||||
yppasswd.newpw.pw_passwd = s;
|
yppasswd.newpw.pw_passwd = s;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user