From owner-freebsd-current Mon Apr 8 3:12: 1 2002 Delivered-To: freebsd-current@freebsd.org Received: from whale.sunbay.crimea.ua (whale.sunbay.crimea.ua [212.110.138.65]) by hub.freebsd.org (Postfix) with ESMTP id A608A37B400; Mon, 8 Apr 2002 03:11:43 -0700 (PDT) Received: (from ru@localhost) by whale.sunbay.crimea.ua (8.11.6/8.11.2) id g38ABdM70305; Mon, 8 Apr 2002 13:11:39 +0300 (EEST) (envelope-from ru) Date: Mon, 8 Apr 2002 13:11:39 +0300 From: Ruslan Ermilov To: Dag-Erling Smorgrav Cc: current@FreeBSD.org Subject: Re: cvs commit: src/lib/libpam/modules/pam_unix pam_unix.c Message-ID: <20020408101138.GA68318@sunbay.com> References: <200204072043.g37KhRi76699@freefall.freebsd.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="x+6KMIRAuhnl3hBn" Content-Disposition: inline In-Reply-To: <200204072043.g37KhRi76699@freefall.freebsd.org> User-Agent: Mutt/1.3.27i Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG --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 . */ =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