]> granicus.if.org Git - linux-pam/commitdiff
Relevant BUGIDs: 1490956,1489818,1489808,1489792,1489804,1489658,1489634
authorThorsten Kukuk <kukuk@thkukuk.de>
Mon, 22 May 2006 17:27:54 +0000 (17:27 +0000)
committerThorsten Kukuk <kukuk@thkukuk.de>
Mon, 22 May 2006 17:27:54 +0000 (17:27 +0000)
Purpose of commit: bugfixes

Commit summary:
---------------

2006-05-22  Thorsten Kukuk  <kukuk@thkukuk.de>

        * modules/pam_listfile/pam_listfile.c (pam_sm_authenticate):
        Fix memory leaks, [#1490956] found by Coverity.

        * modules/pam_tally/pam_tally.c (pam_get_uid): Check return
        value of pam_get_user().
        (tally_get_data): Check if oldtime is not NULL.
        [#1489818] found by Coverity.

        * modules/pam_mkhomedir/pam_mkhomedir.c (create_homedir): Don't
        ignore return value of stat(). [#1489808] found by Coverity.

        * modules/pam_mail/pam_mail.c (get_folder): Fix a potential
        NULL pointer dereference. [#1489792] found by Coverity.

        * libpam/Makefile.am: bump release number of libpam.so.
        * libpam/pam_misc.c (_pam_mkargv): Fix memory leak,
        [#1489804] found by Coverity.

        * modules/pam_echo/pam_echo.c (replace_and_print): Initialize
        str, [#1489658] found by Coverity.

        * modules/pam_cracklib/pam_cracklib.c (_pam_unix_approve_pass): Fix
        a potential NULL pointer dereference.
        (pam_sm_chauthtok): Remove dead code.
        [#1489634] found by Coverity.

ChangeLog
NEWS
libpam/Makefile.am
libpam/pam_misc.c
modules/pam_cracklib/pam_cracklib.c
modules/pam_echo/pam_echo.c
modules/pam_listfile/pam_listfile.c
modules/pam_mail/pam_mail.c
modules/pam_mkhomedir/pam_mkhomedir.c
modules/pam_tally/pam_tally.c

index d1b092feb92ebda7e02915148fe208f6ceeaf009..c55a47ac3cbbd57742e58563c7a8962d4da49068 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+2006-05-22  Thorsten Kukuk  <kukuk@thkukuk.de>
+
+       * modules/pam_listfile/pam_listfile.c (pam_sm_authenticate):
+       Fix memory leaks, [#1490956] found by Coverity.
+
+       * modules/pam_tally/pam_tally.c (pam_get_uid): Check return
+       value of pam_get_user().
+       (tally_get_data): Check if oldtime is not NULL.
+       [#1489818] found by Coverity.
+
+       * modules/pam_mkhomedir/pam_mkhomedir.c (create_homedir): Don't
+       ignore return value of stat(). [#1489808] found by Coverity.
+
+       * modules/pam_mail/pam_mail.c (get_folder): Fix a potential
+       NULL pointer dereference. [#1489792] found by Coverity.
+
+       * libpam/Makefile.am: bump release number of libpam.so.
+       * libpam/pam_misc.c (_pam_mkargv): Fix memory leak,
+       [#1489804] found by Coverity.
+
+       * modules/pam_echo/pam_echo.c (replace_and_print): Initialize
+       str, [#1489658] found by Coverity.
+
+       * modules/pam_cracklib/pam_cracklib.c (_pam_unix_approve_pass): Fix
+       a potential NULL pointer dereference.
+       (pam_sm_chauthtok): Remove dead code.
+       [#1489634] found by Coverity.
+
 2006-05-04  Thorsten Kukuk  <kukuk@suse.de>
 
        * configure.in: Check for fseeko.
diff --git a/NEWS b/NEWS
index 9bc77809caa76950c85f483b74cd047e984fc615..b674b026f151eb0b5f460bdad339a1075639cb69 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,7 @@ Linux-PAM NEWS -- history of user-visible changes.
 
 
 * pam_tally: Fix support for large UIDs
+* Fixed all problems found by Coverity
 
 Release 0.99.4.0
 
index 951c19641f4493f4f181fc2c1b047fd86f54d15f..4648908b8c80243b5f085115364bb0af2208a45c 100644 (file)
@@ -20,7 +20,7 @@ include_HEADERS = $(addprefix include/security/, _pam_compat.h _pam_macros.h _pa
 noinst_HEADERS = pam_prelude.h pam_private.h pam_tokens.h \
                pam_modutil_private.h pam_static_modules.h
 
-libpam_la_LDFLAGS = -no-undefined -version-info 81:3:81 @LIBAUDIT@
+libpam_la_LDFLAGS = -no-undefined -version-info 81:4:81 @LIBAUDIT@
 if STATIC_MODULES
   libpam_la_LDFLAGS += `ls ../modules/pam_*/*.lo` \
        @LIBDB@ @LIBCRYPT@ @LIBNSL@ @LIBCRACK@ -lutil
index 746c7a97ab0615fb2b68b5fea6f9a3fc73b1056f..26590d09240687a05399cd0086c4ad377d67da2a 100644 (file)
@@ -170,11 +170,11 @@ int _pam_mkargv(char *s, char ***argv, int *argc)
                    sbuf = NULL;
                    D(("loop again?"));
                }
-               _pam_drop(sbuf_start);
            }
+           _pam_drop(sbuf_start);
        }
     }
-    
+
     *argv = our_argv;
 
     D(("_pam_mkargv returned"));
@@ -256,7 +256,7 @@ void _pam_parse_control(int *control_array, char *tok)
            error = "expecting '='";
            goto parse_error;
        }
-       
+
        /* skip leading space */
        while (isspace((int)*tok) && *++tok);
        if (!*tok) {
index 091a56f5e311b12385f6381c2dc338dcfc74ecb0..2f146fb4381ff50ff67632bbaff2f91e21782a43 100644 (file)
@@ -473,10 +473,9 @@ static int _pam_unix_approve_pass(pam_handle_t *pamh,
     if (!msg) {
        retval = pam_get_item(pamh, PAM_USER, &user);
        if (retval != PAM_SUCCESS || user == NULL) {
-           if (ctrl & PAM_DEBUG_ARG) {
+           if (ctrl & PAM_DEBUG_ARG)
                pam_syslog(pamh,LOG_ERR,"Can not get username");
-               return PAM_AUTHTOK_ERR;
-           }
+           return PAM_AUTHTOK_ERR;
        }
        msg = check_old_password(user, pass_new);
     }
@@ -663,11 +662,6 @@ PAM_EXTERN int pam_sm_chauthtok(pam_handle_t *pamh, int flags,
                  */
                _pam_drop(resp);
             } else {
-                retval = (retval == PAM_SUCCESS) ?
-                         PAM_AUTHTOK_RECOVERY_ERR:retval ;
-            }
-
-            if (retval != PAM_SUCCESS) {
                 if (ctrl && PAM_DEBUG_ARG)
                     pam_syslog(pamh, LOG_DEBUG,
                               "unable to obtain the password a second time");
index e138c3df409b5628e22402f239ac7ac5de3c065f..6182643734a6183eb1382995de092e941911e164 100644 (file)
@@ -67,7 +67,7 @@ replace_and_print (pam_handle_t *pamh, const char *mesg)
   char *output;
   size_t length = strlen (mesg) + PAM_MAX_MSG_SIZE;
   char myhostname[HOST_NAME_MAX+1];
-  const void *str;
+  const void *str = NULL;
   const char *p, *q;
   int item;
   size_t len;
index 69384be65e12276cf95ded0dcc4aadbc9c5aa7a8..1545fe033bafaf628fd6db6b0e1b468eb7147164 100644 (file)
@@ -108,16 +108,21 @@ pam_sm_authenticate (pam_handle_t *pamh, int flags UNUSED,
                onerr = PAM_SUCCESS;
            else if(!strcmp(myval,"fail"))
                onerr = PAM_SERVICE_ERR;
-           else
+           else {
+               if (ifname) free (ifname);
                return PAM_SERVICE_ERR;
+           }
        else if(!strcmp(mybuf,"sense"))
            if(!strcmp(myval,"allow"))
                sense=0;
            else if(!strcmp(myval,"deny"))
                sense=1;
-           else
+           else {
+               if (ifname) free (ifname);
                return onerr;
+           }
        else if(!strcmp(mybuf,"file")) {
+           if (ifname) free (ifname);
            ifname = (char *)malloc(strlen(myval)+1);
            if (!ifname)
                return PAM_BUF_ERR;
@@ -176,6 +181,7 @@ pam_sm_authenticate (pam_handle_t *pamh, int flags UNUSED,
               ) {
        pam_syslog(pamh,LOG_ERR,
                  "Invalid usage for apply= parameter");
+        free (ifname);
        return onerr;
     }
 
index 5eb3488b4be6f11ff660212ccd09579ee30e54cf..7d43d5e01647b74fd3272bcb6e340ad52923b527 100644 (file)
@@ -1,8 +1,6 @@
 /* pam_mail module */
 
 /*
- * $Id$
- *
  * Written by Andrew Morgan <morgan@linux.kernel.org> 1996/3/11
  * $HOME additions by David Kinchlea <kinch@kinch.ark.com> 1997/1/7
  * mailhash additions by Chris Adams <cadams@ro.com> 1998/7/11
@@ -174,6 +172,14 @@ get_folder(pam_handle_t *pamh, int ctrl,
 
     retval = PAM_BUF_ERR;
     if (ctrl & PAM_HOME_MAIL) {
+        if (pwd == NULL) {
+           pwd = pam_modutil_getpwnam(pamh, user);
+           if (pwd == NULL) {
+               pam_syslog(pamh, LOG_ERR, "user unknown");
+               retval = PAM_USER_UNKNOWN;
+               goto get_folder_cleanup;
+           }
+       }
        if (asprintf(&folder, MAIL_FILE_FORMAT, pwd->pw_dir, "", path) < 0)
            goto get_folder_cleanup;
     } else {
index 799d19fc2494c09e2471e5bc6866c89d9b421a04..216f252a76c1a67ed9a5cd8670a8917f1aeae496 100644 (file)
@@ -341,7 +341,20 @@ create_homedir (pam_handle_t * pamh, int ctrl,
 
         return PAM_PERM_DENIED;
       }
-      stat(newsource,&St);
+      if (stat(newsource,&St) != 0)
+       {
+         pam_syslog(pamh, LOG_DEBUG, "unable to stat src file %s: %m",
+                    newsource);
+         close(SrcFd);
+         closedir(D);
+
+#ifndef PATH_MAX
+         free(newsource); newsource = NULL;
+         free(newdest); newdest = NULL;
+#endif
+
+         return PAM_PERM_DENIED;
+       }
 
       /* Open the dest file */
       if ((DestFd = open(newdest,O_WRONLY | O_TRUNC | O_CREAT,0600)) < 0)
index f3642c34653ce1befc6092c746b908c3f4391ee4..12cb5bfa6e07ae95c1eea4776378328cb7834f07 100644 (file)
@@ -231,7 +231,10 @@ pam_get_uid(pam_handle_t *pamh, uid_t *uid, const char **userp, struct tally_opt
 #ifdef MAIN
     user = cline_user;
 #else
-    pam_get_user( pamh, &user, NULL );
+    if ((pam_get_user( pamh, &user, NULL )) != PAM_SUCCESS) {
+      pam_syslog(pamh, LOG_ERR, "pam_get_user; user?");
+      return PAM_AUTH_ERR;
+    }
 #endif
 
     if ( !user || !*user ) {
@@ -288,7 +291,8 @@ tally_get_data( pam_handle_t *pamh, time_t *oldtime )
     }
     else {
       rv = -1;
-      *oldtime = 0;
+      if (oldtime)
+       *oldtime = 0;
     }
     return rv;
 }