]> granicus.if.org Git - linux-pam/blobdiff - modules/pam_unix/pam_unix_auth.c
Relevant BUGIDs: none
[linux-pam] / modules / pam_unix / pam_unix_auth.c
index a42e492669f93ef4c4d9c277df7a02a11060ce6f..2ed24127fef7b56eaff39b3623e4fa03949516c4 100644 (file)
  * 3. The name of the author may not be used to endorse or promote
  *    products derived from this software without specific prior
  *    written permission.
- * 
+ *
  * ALTERNATIVELY, this product may be distributed under the terms of
  * the GNU Public License, in which case the provisions of the GPL are
  * required INSTEAD OF the above restrictions.  (This clause is
  * necessary due to a potential bad interaction between the GPL and
  * the restrictions contained in a BSD-style copyright.)
- * 
+ *
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@@ -87,18 +87,28 @@ do {                                                                \
                                        retval));               \
                *ret_data = retval;                             \
                pam_set_data(pamh, "unix_setcred_return",       \
-                               (void *) ret_data, NULL);       \
-       }                                                       \
+                            (void *) ret_data, setcred_free);  \
+       } else if (ret_data)                                    \
+         free (ret_data);                                      \
        D(("done. [%s]", pam_strerror(pamh, retval)));          \
        return retval;                                          \
 } while (0)
 
+
+static void setcred_free (pam_handle_t * pamh, void *ptr, int err)
+{
+       if (ptr)
+               free (ptr);
+}
+
+
 PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags
                                   ,int argc, const char **argv)
 {
        unsigned int ctrl;
        int retval, *ret_data = NULL;
-       const char *name, *p;
+       const char *name;
+       const void *p;
 
        D(("called."));
 
@@ -111,7 +121,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags
 
        /* get the user'name' */
 
-       retval = pam_get_user(pamh, &name, "login: ");
+       retval = pam_get_user(pamh, &name, NULL);
        if (retval == PAM_SUCCESS) {
                /*
                 * Various libraries at various times have had bugs related to
@@ -140,7 +150,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags
 
        /* if this user does not have a password... */
 
-       if (_unix_blankpasswd(ctrl, name)) {
+       if (_unix_blankpasswd(pamh, ctrl, name)) {
                D(("user '%s' has blank passwd", name));
                name = NULL;
                retval = PAM_SUCCESS;
@@ -175,7 +185,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags
 }
 
 
-/* 
+/*
  * The only thing _pam_set_credentials_unix() does is initialization of
  * UNIX group IDs.
  *
@@ -188,20 +198,19 @@ PAM_EXTERN int pam_sm_setcred(pam_handle_t * pamh, int flags
                              ,int argc, const char **argv)
 {
        int retval;
-       int *pretval = NULL;
+       const void *pretval = NULL;
 
        D(("called."));
 
        retval = PAM_SUCCESS;
 
        D(("recovering return code from auth call"));
-       /* We will only find something here if UNIX_LIKE_AUTH is set -- 
+       /* We will only find something here if UNIX_LIKE_AUTH is set --
           don't worry about an explicit check of argv. */
-       pam_get_data(pamh, "unix_setcred_return", (const void **) &pretval);
-       pam_set_data(pamh, "unix_setcred_return", NULL, NULL);
+       pam_get_data(pamh, "unix_setcred_return", &pretval);
        if(pretval) {
-               retval = *pretval;
-               free(pretval);
+               retval = *(const int *)pretval;
+               pam_set_data(pamh, "unix_setcred_return", NULL, NULL);
                D(("recovered data indicates that old retval was %d", retval));
        }