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>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
On Sun, Apr 07, 2002 at 01:43:27PM -0700, Dag-Erling Smorgrav wrote:
> des 2002/04/07 13:43:27 PDT
>
> Modified files:
> lib/libpam/modules/pam_unix pam_unix.c
> 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.
>
> Sponsored by: DARPA, NAI Labs
>
> Revision Changes Path
> 1.29 +8 -6 src/lib/libpam/modules/pam_unix/pam_unix.c
>
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
===================================================================
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,
struct passwd *pwd;
int retval;
const char *pass, *user;
- char *encrypted, *password_prompt;
+ char *encrypted;
+ const char *password_prompt;
pam_std_option(&options, other_options, argc, argv);
@@ -141,7 +142,7 @@ pam_sm_authenticate(pam_handle_t *pamh,
lc = login_getclass(NULL);
password_prompt = login_getcapstr(lc, "passwd_prompt",
- password_prompt, NULL);
+ "Password:", NULL);
login_close(lc);
lc = NULL;
@@ -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];
pwd = getpwnam(user);
if (pwd == NULL)
%%%
But this patch won't work without the "const poisoning" lib/libutil:
%%%
Index: login_auth.c
===================================================================
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;
/* Do we ignore a nologin file? */
if (login_getcapbool(lc, "ignorenologin", 0))
Index: login_cap.3
===================================================================
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 *chars"
-.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" "rlim_t error"
.Ft rlim_t
@@ -66,8 +66,8 @@
.Fn login_getcapsize "login_cap_t *lc" "const char *cap" "rlim_t def" "rlim_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 *error"
.Sh DESCRIPTION
Index: login_cap.c
===================================================================
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.
*/
-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 char *error)
{
char *res;
int ret;
@@ -373,7 +373,7 @@ login_getcaplist(login_cap_t *lc, const
if (chars == NULL)
chars = ", \t";
- if ((lstring = login_getcapstr(lc, cap, NULL, NULL)) != NULL)
+ if ((lstring = (char *)login_getcapstr(lc, cap, NULL, NULL)) != NULL)
return arrayize(lstring, chars, NULL);
return NULL;
}
@@ -387,15 +387,15 @@ login_getcaplist(login_cap_t *lc, const
* If there is an error of any kind, return <error>.
*/
-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;
- if ((str = login_getcapstr(lc, (char*)cap, NULL, NULL)) == NULL)
+ if ((str = login_getcapstr(lc, cap, NULL, NULL)) == NULL)
str = error;
else {
- char *ptr = str;
+ char *ptr = (char *)str;
while (*ptr) {
int count = strcspn(ptr, ", \t");
@@ -764,8 +764,8 @@ login_getcapbool(login_cap_t *lc, const
* login_getstyle(lc, "skey", "network");
*/
-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 = NULL;
Index: login_cap.h
===================================================================
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 *);
-char *login_getcapstr(login_cap_t*, const char *, char *, char *);
+const char *login_getcapstr(login_cap_t*, const char *, const char *, const 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 *);
Index: login_class.c
===================================================================
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 {
};
static char *
-substvar(char * var, const struct passwd * pwd, int hlen, int pch, int nlen)
+substvar(const char * var, const struct passwd * pwd, int hlen, int pch, int nlen)
{
char *np = NULL;
@@ -137,12 +137,10 @@ substvar(char * var, const struct passwd
if (pwd != NULL) {
/* Count the number of ~'s in var to substitute */
- p = var;
- for (p = var; (p = strchr(p, '~')) != NULL; p++)
+ for (p = (char *)var; (p = strchr(p, '~')) != NULL; p++)
++tildes;
/* Count the number of $'s in var to substitute */
- p = var;
- for (p = var; (p = strchr(p, '$')) != NULL; p++)
+ for (p = (char *)var; (p = strchr(p, '$')) != NULL; p++)
++dollas;
}
@@ -197,8 +195,8 @@ setclassenvironment(login_cap_t *lc, con
++pch;
while (vars->tag != NULL) {
- char * var = paths ? login_getpath(lc, vars->tag, NULL)
- : login_getcapstr(lc, vars->tag, NULL, NULL);
+ const char * var = paths ? login_getpath(lc, vars->tag, NULL)
+ : login_getcapstr(lc, vars->tag, NULL, NULL);
char * np = substvar(var, pwd, hlen, pch, nlen);
Index: login_crypt.c
===================================================================
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;
- cipher = login_getcapstr(lc, "passwd_format", (char *)def, NULL);
+ cipher = login_getcapstr(lc, "passwd_format", def, NULL);
if (getenv("CRYPT_DEBUG") != NULL)
fprintf(stderr, "login_setcryptfmt: "
"passwd_format = %s\n", cipher);
%%%
I will see how much breakage this adds to "buildworld".
Cheers,
--
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
[-- Attachment #2 --]
-----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-----
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020408101138.GA68318>
