Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 8 Apr 2002 13:11:39 +0300
From:      Ruslan Ermilov <ru@FreeBSD.org>
To:        Dag-Erling Smorgrav <des@FreeBSD.org>
Cc:        current@FreeBSD.org
Subject:   Re: cvs commit: src/lib/libpam/modules/pam_unix pam_unix.c
Message-ID:  <20020408101138.GA68318@sunbay.com>
In-Reply-To: <200204072043.g37KhRi76699@freefall.freebsd.org>
References:  <200204072043.g37KhRi76699@freefall.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--x+6KMIRAuhnl3hBn
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Sun, Apr 07, 2002 at 01:43:27PM -0700, Dag-Erling Smorgrav wrote:
> des         2002/04/07 13:43:27 PDT
>=20
>   Modified files:
>     lib/libpam/modules/pam_unix pam_unix.c=20
>   Log:
>   Fix bug in previous commit that passed the wrong default value to
>   login_getcapstr(3).  Also fix a longer-standing bug (login_close(3)
>   frees the string returned by login_getcapstr(3)) by reorganizing the
>   code a little, and use login_getpwclass(3) instead of login_getclass(3)
>   if we already have a struct pwd.
>  =20
>   Sponsored by:   DARPA, NAI Labs
>  =20
>   Revision  Changes    Path
>   1.29      +8 -6      src/lib/libpam/modules/pam_unix/pam_unix.c
>=20
This change also broke the "Password:" prompt.  The bug is hidden by
the -Wno-uninitialized setting in bsd.sys.mk.  Here's the patch:

%%%
Index: pam_unix.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /home/ncvs/src/lib/libpam/modules/pam_unix/pam_unix.c,v
retrieving revision 1.28
diff -u -p -r1.28 pam_unix.c
--- pam_unix.c	6 Apr 2002 19:30:04 -0000	1.28
+++ pam_unix.c	8 Apr 2002 09:53:12 -0000
@@ -122,7 +122,8 @@ pam_sm_authenticate(pam_handle_t *pamh,=20
 	struct passwd *pwd;
 	int retval;
 	const char *pass, *user;
-	char *encrypted, *password_prompt;
+	char *encrypted;
+	const char *password_prompt;
=20
 	pam_std_option(&options, other_options, argc, argv);
=20
@@ -141,7 +142,7 @@ pam_sm_authenticate(pam_handle_t *pamh,=20
=20
 	lc =3D login_getclass(NULL);
 	password_prompt =3D login_getcapstr(lc, "passwd_prompt",
-	    password_prompt, NULL);
+	    "Password:", NULL);
 	login_close(lc);
 	lc =3D NULL;
=20
@@ -512,7 +513,8 @@ local_passwd(const char *user, const cha
 	login_cap_t * lc;
 	struct passwd *pwd;
 	int pfd, tfd;
-	char *crypt_type, salt[SALTSIZE + 1];
+	const char *crypt_type;
+	char salt[SALTSIZE + 1];
=20
 	pwd =3D getpwnam(user);
 	if (pwd =3D=3D NULL)
%%%

But this patch won't work without the "const poisoning" lib/libutil:

%%%
Index: login_auth.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /home/ncvs/src/lib/libutil/login_auth.c,v
retrieving revision 1.12
diff -u -p -r1.12 login_auth.c
--- login_auth.c	30 Sep 2001 22:35:07 -0000	1.12
+++ login_auth.c	8 Apr 2002 09:58:59 -0000
@@ -65,7 +65,7 @@ __FBSDID("$FreeBSD: src/lib/libutil/logi
 void
 auth_checknologin(login_cap_t *lc)
 {
-  char *file;
+  const char *file;
=20
   /* Do we ignore a nologin file? */
   if (login_getcapbool(lc, "ignorenologin", 0))
Index: login_cap.3
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /home/ncvs/src/lib/libutil/login_cap.3,v
retrieving revision 1.27
diff -u -p -r1.27 login_cap.3
--- login_cap.3	1 Oct 2001 16:09:18 -0000	1.27
+++ login_cap.3	8 Apr 2002 09:58:59 -0000
@@ -52,12 +52,12 @@
 .Fn login_getpwclass "const struct passwd *pwd"
 .Ft login_cap_t *
 .Fn login_getuserclass "const struct passwd *pwd"
-.Ft char *
-.Fn login_getcapstr "login_cap_t *lc" "const char *cap" "char *def" "char =
*error"
+.Ft "const char *"
+.Fn login_getcapstr "login_cap_t *lc" "const char *cap" "const char *def" =
"const char *error"
 .Ft char **
 .Fn login_getcaplist "login_cap_t *lc" "const char *cap" "const char *char=
s"
-.Ft char *
-.Fn login_getpath "login_cap_t *lc" "const char *cap" "char *error"
+.Ft "const char *"
+.Fn login_getpath "login_cap_t *lc" "const char *cap" "const char *error"
 .Ft rlim_t
 .Fn login_getcaptime "login_cap_t *lc" "const char *cap" "rlim_t def" "rli=
m_t error"
 .Ft rlim_t
@@ -66,8 +66,8 @@
 .Fn login_getcapsize "login_cap_t *lc" "const char *cap" "rlim_t def" "rli=
m_t error"
 .Ft int
 .Fn login_getcapbool "login_cap_t *lc" "const char *cap" "int def"
-.Ft char *
-.Fn login_getstyle "login_cap_t *lc" "char *style" "const char *auth"
+.Ft "const char *"
+.Fn login_getstyle "login_cap_t *lc" "const char *style" "const char *auth"
 .Ft const char *
 .Fn login_setcryptfmt "login_cap_t *lc" "const char *def" "const char *err=
or"
 .Sh DESCRIPTION
Index: login_cap.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /home/ncvs/src/lib/libutil/login_cap.c,v
retrieving revision 1.26
diff -u -p -r1.26 login_cap.c
--- login_cap.c	6 Mar 2002 15:24:51 -0000	1.26
+++ login_cap.c	8 Apr 2002 09:58:59 -0000
@@ -344,8 +344,8 @@ login_getuserclass(const struct passwd *
  * an error string on error.
  */
=20
-char *
-login_getcapstr(login_cap_t *lc, const char *cap, char *def, char *error)
+const char *
+login_getcapstr(login_cap_t *lc, const char *cap, const char *def, const c=
har *error)
 {
     char    *res;
     int	    ret;
@@ -373,7 +373,7 @@ login_getcaplist(login_cap_t *lc, const=20
=20
     if (chars =3D=3D NULL)
 	chars =3D ", \t";
-    if ((lstring =3D login_getcapstr(lc, cap, NULL, NULL)) !=3D NULL)
+    if ((lstring =3D (char *)login_getcapstr(lc, cap, NULL, NULL)) !=3D NU=
LL)
 	return arrayize(lstring, chars, NULL);
     return NULL;
 }
@@ -387,15 +387,15 @@ login_getcaplist(login_cap_t *lc, const=20
  * If there is an error of any kind, return <error>.
  */
=20
-char *
-login_getpath(login_cap_t *lc, const char *cap, char * error)
+const char *
+login_getpath(login_cap_t *lc, const char *cap, const char *error)
 {
-    char    *str;
+    const char *str;
=20
-    if ((str =3D login_getcapstr(lc, (char*)cap, NULL, NULL)) =3D=3D NULL)
+    if ((str =3D login_getcapstr(lc, cap, NULL, NULL)) =3D=3D NULL)
 	str =3D error;
     else {
-	char *ptr =3D str;
+	char *ptr =3D (char *)str;
=20
 	while (*ptr) {
 	    int count =3D strcspn(ptr, ", \t");
@@ -764,8 +764,8 @@ login_getcapbool(login_cap_t *lc, const=20
  *     login_getstyle(lc, "skey", "network");
  */
=20
-char *
-login_getstyle(login_cap_t *lc, char *style, const char *auth)
+const char *
+login_getstyle(login_cap_t *lc, const char *style, const char *auth)
 {
     int	    i;
     char    **authtypes =3D NULL;
Index: login_cap.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /home/ncvs/src/lib/libutil/login_cap.h,v
retrieving revision 1.5
diff -u -p -r1.5 login_cap.h
--- login_cap.h	21 Mar 2002 23:52:49 -0000	1.5
+++ login_cap.h	8 Apr 2002 09:58:59 -0000
@@ -102,13 +102,13 @@ login_cap_t *login_getclass(const char *
 login_cap_t *login_getpwclass(const struct passwd *);
 login_cap_t *login_getuserclass(const struct passwd *);
=20
-char *login_getcapstr(login_cap_t*, const char *, char *, char *);
+const char *login_getcapstr(login_cap_t*, const char *, const char *, cons=
t char *);
 char **login_getcaplist(login_cap_t *, const char *, const char *);
-char *login_getstyle(login_cap_t *, char *, const char *);
+const char *login_getstyle(login_cap_t *, const char *, const char *);
 rlim_t login_getcaptime(login_cap_t *, const char *, rlim_t, rlim_t);
 rlim_t login_getcapnum(login_cap_t *, const char *, rlim_t, rlim_t);
 rlim_t login_getcapsize(login_cap_t *, const char *, rlim_t, rlim_t);
-char *login_getpath(login_cap_t *, const char *, char *);
+const char *login_getpath(login_cap_t *, const char *, const char *);
 int login_getcapbool(login_cap_t *, const char *, int);
 const char *login_setcryptfmt(login_cap_t *, const char *, const char *);
=20
Index: login_class.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /home/ncvs/src/lib/libutil/login_class.c,v
retrieving revision 1.16
diff -u -p -r1.16 login_class.c
--- login_class.c	30 Sep 2001 22:35:07 -0000	1.16
+++ login_class.c	8 Apr 2002 09:58:59 -0000
@@ -126,7 +126,7 @@ static struct login_vars {
 };
=20
 static char *
-substvar(char * var, const struct passwd * pwd, int hlen, int pch, int nle=
n)
+substvar(const char * var, const struct passwd * pwd, int hlen, int pch, i=
nt nlen)
 {
     char    *np =3D NULL;
=20
@@ -137,12 +137,10 @@ substvar(char * var, const struct passwd
=20
 	if (pwd !=3D NULL) {
 	    /* Count the number of ~'s in var to substitute */
-	    p =3D var;
-	    for (p =3D var; (p =3D strchr(p, '~')) !=3D NULL; p++)
+	    for (p =3D (char *)var; (p =3D strchr(p, '~')) !=3D NULL; p++)
 		++tildes;
 	    /* Count the number of $'s in var to substitute */
-	    p =3D var;
-	    for (p =3D var; (p =3D strchr(p, '$')) !=3D NULL; p++)
+	    for (p =3D (char *)var; (p =3D strchr(p, '$')) !=3D NULL; p++)
 		++dollas;
 	}
=20
@@ -197,8 +195,8 @@ setclassenvironment(login_cap_t *lc, con
 	++pch;
=20
     while (vars->tag !=3D NULL) {
-	char * var =3D paths ? login_getpath(lc, vars->tag, NULL)
-	    		   : login_getcapstr(lc, vars->tag, NULL, NULL);
+	const char * var =3D paths ? login_getpath(lc, vars->tag, NULL)
+				 : login_getcapstr(lc, vars->tag, NULL, NULL);
=20
 	char * np  =3D substvar(var, pwd, hlen, pch, nlen);
=20
Index: login_crypt.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /home/ncvs/src/lib/libutil/login_crypt.c,v
retrieving revision 1.4
diff -u -p -r1.4 login_crypt.c
--- login_crypt.c	30 Sep 2001 22:35:07 -0000	1.4
+++ login_crypt.c	8 Apr 2002 09:58:59 -0000
@@ -38,7 +38,7 @@ const char *
 login_setcryptfmt(login_cap_t *lc, const char *def, const char *error) {
 	const char *cipher;
=20
-	cipher =3D login_getcapstr(lc, "passwd_format", (char *)def, NULL);
+	cipher =3D login_getcapstr(lc, "passwd_format", def, NULL);
 	if (getenv("CRYPT_DEBUG") !=3D NULL)
 		fprintf(stderr, "login_setcryptfmt: "
 		    "passwd_format =3D %s\n", cipher);
%%%

I will see how much breakage this adds to "buildworld".


Cheers,
--=20
Ruslan Ermilov		Sysadmin and DBA,
ru@sunbay.com		Sunbay Software AG,
ru@FreeBSD.org		FreeBSD committer,
+380.652.512.251	Simferopol, Ukraine

http://www.FreeBSD.org	The Power To Serve
http://www.oracle.com	Enabling The Information Age

--x+6KMIRAuhnl3hBn
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (FreeBSD)
Comment: For info see http://www.gnupg.org

iD8DBQE8sWzaUkv4P6juNwoRAunIAJ4wC0Qfenqg1nsoQO5qs+nSLPIRPACdESl9
IknCgUo9b95/azzgp87abQY=
=DyX2
-----END PGP SIGNATURE-----

--x+6KMIRAuhnl3hBn--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020408101138.GA68318>