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>
