[comp.bugs.4bsd] chsh/passwd -s in 4.3BSD

andy@cheviot.newcastle.ac.uk (Andy Linton) (01/16/87)

Imagine my surprise when I was told by chsh (or passwd -s)
that
/bin/sh is unacceptable as a new shell.

/bin/csh and /bin/msh were equally unacceptable.

The problem occurs because passwd -s uses getusershell()
to read /etc/shells in two places and doesn't rewind to
the beginning of /etc/shells before reading again. This
I feel sure has been seen before but a fix follows.

Feed me to patch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*** passwd.c	Fri Jan 16 15:42:16 1987
--- passwd.c.orig	Fri Jan 16 11:10:13 1987
***************
*** 340,346 ****
  {
  	static char newshell[BUFSIZ];
  	char *cp, *valid, *getusershell();
- 	int endusershell();
  
  	if (pwd->pw_shell == 0 || *pwd->pw_shell == '\0')
  		pwd->pw_shell = DEFSHELL;
--- 340,345 ----
***************
*** 348,354 ****
  		for (valid = getusershell(); valid; valid = getusershell())
  			if (strcmp(pwd->pw_shell, valid) == 0)
  				break;
- 		(void) endusershell();	/* close /etc/shells */
  		if (valid == NULL) {
  			printf("Cannot change from restricted shell %s\n",
  				pwd->pw_shell);
--- 347,352 ----
***************
*** 389,396 ****
  				break;
  		}
  	}
! 	(void) endusershell();	/* close /etc/shells */
! 	if (valid == NULL) {
  		printf("%s is unacceptable as a new shell.\n",
  		    newshell);
  		exit(1);
--- 387,393 ----
  				break;
  		}
  	}
! 	if (valid == 0) {
  		printf("%s is unacceptable as a new shell.\n",
  		    newshell);
  		exit(1);
---
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SENDER 	: Andy Linton		PHONE	: +44 91 232 9233
POST	: Computing Lab, University of Newcastle upon Tyne, UK, NE1 7RU
ARPA	: andy%cheviot.newcastle.ac.uk@cs.ucl.ac.uk
JANET	: andy@uk.ac.newcastle.cheviot
UUCP	: andy@cheviot.UUCP

***  Ni fui moran beagan d'aon rud, ach is fui moran beagan ceille.  ***