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

Attachment: msg37089/pgp00000.pgp
Description: PGP signature

Reply via email to