]> 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..1a89a4b26b3451ad14d108e9baff5328a60f6d49 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
@@ -37,7 +37,7 @@
 
 /* #define DEBUG */
 
-#include <security/_pam_aconf.h>
+#include "config.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -87,18 +87,29 @@ 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 UNUSED, void *ptr, int err UNUSED)
+{
+       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 +122,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 +151,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 +186,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.
  *
@@ -184,24 +195,24 @@ PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags
  * warned you. -- AOY
  */
 
-PAM_EXTERN int pam_sm_setcred(pam_handle_t * pamh, int flags
-                             ,int argc, const char **argv)
+PAM_EXTERN int
+pam_sm_setcred (pam_handle_t *pamh, int flags UNUSED,
+               int argc UNUSED, const char **argv UNUSED)
 {
        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);
-       if(pretval) {
-               retval = *pretval;
-               free(pretval);
+       if (pam_get_data(pamh, "unix_setcred_return", &pretval) == PAM_SUCCESS
+           && pretval) {
+               retval = *(const int *)pretval;
+               pam_set_data(pamh, "unix_setcred_return", NULL, NULL);
                D(("recovered data indicates that old retval was %d", retval));
        }