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, [EMAIL PROTECTED] Sunbay Software AG, [EMAIL PROTECTED] FreeBSD committer, +380.652.512.251 Simferopol, Ukraine http://www.FreeBSD.org The Power To Serve http://www.oracle.com Enabling The Information Age
msg37089/pgp00000.pgp
Description: PGP signature