walters / rpms / pam

Forked from rpms/pam 5 years ago
Clone
b5054fa
diff -up Linux-PAM-1.1.7/modules/pam_tty_audit/pam_tty_audit.c.tty-audit-init Linux-PAM-1.1.7/modules/pam_tty_audit/pam_tty_audit.c
b5054fa
--- Linux-PAM-1.1.7/modules/pam_tty_audit/pam_tty_audit.c.tty-audit-init	2013-08-28 10:53:40.000000000 +0200
b5054fa
+++ Linux-PAM-1.1.7/modules/pam_tty_audit/pam_tty_audit.c	2013-10-04 14:51:19.944994905 +0200
b5054fa
@@ -36,6 +36,7 @@
b5054fa
    USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
b5054fa
    DAMAGE. */
b5054fa
 
b5054fa
+#include "config.h"
b5054fa
 #include <errno.h>
b5054fa
 #include <fnmatch.h>
b5054fa
 #include <stdlib.h>
b5054fa
@@ -108,7 +109,7 @@ nl_recv (int fd, unsigned type, void *bu
b5054fa
   struct msghdr msg;
b5054fa
   struct nlmsghdr nlm;
b5054fa
   struct iovec iov[2];
b5054fa
-  ssize_t res;
b5054fa
+  ssize_t res, resdiff;
b5054fa
 
b5054fa
  again:
b5054fa
   iov[0].iov_base = &nlm;
b5054fa
@@ -160,12 +161,17 @@ nl_recv (int fd, unsigned type, void *bu
b5054fa
   res = recvmsg (fd, &msg, 0);
b5054fa
   if (res == -1)
b5054fa
     return -1;
b5054fa
-  if ((size_t)res != NLMSG_LENGTH (size)
b5054fa
+  resdiff = NLMSG_LENGTH(size) - (size_t)res;
b5054fa
+  if (resdiff < 0
b5054fa
       || nlm.nlmsg_type != type)
b5054fa
     {
b5054fa
       errno = EIO;
b5054fa
       return -1;
b5054fa
     }
b5054fa
+  else if (resdiff > 0)
b5054fa
+    {
b99d0d5
+      memset((char *)buf + size - resdiff, 0, resdiff);
b5054fa
+    }
b5054fa
   return 0;
b5054fa
 }
b5054fa
 
b5054fa
@@ -275,6 +281,8 @@ pam_sm_open_session (pam_handle_t *pamh,
b5054fa
       return PAM_SESSION_ERR;
b5054fa
     }
b5054fa
 
b5054fa
+  memcpy(&new_status, old_status, sizeof(new_status));
b5054fa
+
b5054fa
   new_status.enabled = (command == CMD_ENABLE ? 1 : 0);
b5054fa
 #ifdef HAVE_STRUCT_AUDIT_TTY_STATUS_LOG_PASSWD
b5054fa
   new_status.log_passwd = log_passwd;