Blob Blame History Raw
diff -urp audit-3.0.orig/src/auditd.c audit-3.0/src/auditd.c
--- audit-3.0.orig/src/auditd.c	2018-12-06 20:01:06.923443360 -0500
+++ audit-3.0/src/auditd.c	2018-12-06 20:17:19.030339043 -0500
@@ -214,24 +214,35 @@ static void cont_handler(struct ev_loop
 
 static int extract_type(const char *str)
 {
-	const char *tptr, *ptr2, *ptr = str;
+	char tmp, *ptr2, *ptr = str;
+	int type;
 	if (*str == 'n') {
 		ptr = strchr(str+1, ' ');
 		if (ptr == NULL)
 			return -1; // Malformed - bomb out
 		ptr++;
 	}
+
 	// ptr should be at 't'
 	ptr2 = strchr(ptr, ' ');
-	// get type=xxx in a buffer
-	tptr = strndupa(ptr, ptr2 - ptr);
+
 	// find =
-	str = strchr(tptr, '=');
-	if (str == NULL)
+	str = strchr(ptr, '=');
+	if (str == NULL || str >= ptr2)
 		return -1; // Malformed - bomb out
+
 	// name is 1 past
 	str++;
-	return audit_name_to_msg_type(str);
+
+	// Save character & terminate string
+	tmp = *ptr2;
+	*ptr2 = 0;
+
+	type = audit_name_to_msg_type(str);
+
+	*ptr2 = tmp; // Restore character
+
+	return type;
 }
 
 void distribute_event(struct auditd_event *e)
@@ -250,18 +261,22 @@ void distribute_event(struct auditd_even
 			route = 0;
 		else {	// We only need the original type if its being routed
 			e->reply.type = extract_type(e->reply.message);
-			char *p = strchr(e->reply.message,
-					AUDIT_INTERP_SEPARATOR);
-			if (p)
-				proto = AUDISP_PROTOCOL_VER2;
-			else
-				proto = AUDISP_PROTOCOL_VER;
 
+			// Treat everything from the network as VER2
+			// because they are already formatted. This is
+			// important when it gets to the dispatcher which
+			// can strip node= when its VER1.
+			proto = AUDISP_PROTOCOL_VER2;
 		}
-	} else if (e->reply.type != AUDIT_DAEMON_RECONFIG)
-		// All other events need formatting
+	} else if (e->reply.type != AUDIT_DAEMON_RECONFIG) {
+		// All other local events need formatting
 		format_event(e);
-	else
+
+		// If the event has been formatted with node, upgrade
+		// to VER2 so that the dispatcher honors the formatting
+		if (config.node_name_format != N_NONE)
+			proto = AUDISP_PROTOCOL_VER2;
+	} else
 		route = 0; // Don't DAEMON_RECONFIG events until after enqueue
 
 	/* End of Event is for realtime interface - skip local logging of it */
@@ -748,6 +763,17 @@ int main(int argc, char *argv[])
 		return 1;
 	}
 
+	/* Startup libev and dispatcher */
+	loop = ev_default_loop(EVFLAG_NOENV);
+	if (init_dispatcher(&config)) {
+		if (pidfile)
+			unlink(pidfile);
+		tell_parent(FAILURE);
+		free_config(&config);
+		ev_default_destroy();
+		return 1;
+	}
+
 	/* Get machine name ready for use */
 	if (resolve_node(&config)) {
 		if (pidfile)
@@ -755,6 +781,7 @@ int main(int argc, char *argv[])
 		shutdown_dispatcher();
 		tell_parent(FAILURE);
 		free_config(&config);
+		ev_default_destroy();
 		return 1;
 	}
 
@@ -766,6 +793,7 @@ int main(int argc, char *argv[])
 		shutdown_dispatcher();
 		tell_parent(FAILURE);
 		free_config(&config);
+		ev_default_destroy();
 		return 1;
 	}
 	fcntl(pipefds[0], F_SETFD, FD_CLOEXEC);
@@ -785,6 +813,7 @@ int main(int argc, char *argv[])
 			tell_parent(FAILURE);
 			close_pipes();
 			free_config(&config);
+			ev_default_destroy();
 			return 1;
 		}
 		if (getsubj(subj))
@@ -811,6 +840,7 @@ int main(int argc, char *argv[])
 			tell_parent(FAILURE);
 			close_pipes();
 			free_config(&config);
+			ev_default_destroy();
 			return 1;
 		}
 	}
@@ -821,6 +851,7 @@ int main(int argc, char *argv[])
 	/* let config manager init */
 	init_config_manager();
 
+	/* Depending on value of opt_startup (-s) set initial audit state */
 	if (opt_startup != startup_nochange && !opt_aggregate_only &&
 			(audit_is_enabled(fd) < 2) &&
 			audit_set_enabled(fd, (int)opt_startup) < 0) {
@@ -849,6 +880,7 @@ int main(int argc, char *argv[])
 		tell_parent(FAILURE);
 		close_pipes();
 		free_config(&config);
+		ev_default_destroy();
 		return 1;
 	}
 
@@ -877,20 +909,11 @@ int main(int argc, char *argv[])
 		tell_parent(FAILURE);
 		close_pipes();
 		free_config(&config);
+		ev_default_destroy();
 		return 1;
 	}
 
-	/* Depending on value of opt_startup (-s) set initial audit state */
-	loop = ev_default_loop (EVFLAG_NOENV);
-
-	if (init_dispatcher(&config)) {
-		if (pidfile)
-			unlink(pidfile);
-		tell_parent(FAILURE);
-		free_config(&config);
-		return 1;
-	}
-
+	/* Start up all the handlers */
 	if (!opt_aggregate_only) {
 		ev_io_init (&netlink_watcher, netlink_handler, fd, EV_READ);
 		ev_io_start (loop, &netlink_watcher);
diff -urp audit-3.0.orig/src/auditd-dispatch.c audit-3.0/src/auditd-dispatch.c
--- audit-3.0.orig/src/auditd-dispatch.c	2018-08-31 17:05:48.000000000 -0400
+++ audit-3.0/src/auditd-dispatch.c	2018-12-06 20:17:09.769340037 -0500
@@ -70,6 +70,7 @@ int dispatch_event(const struct audit_re
 	if (!libdisp_active())
 		return 0;
 
+	// Translate event into dispatcher format
 	e = malloc(sizeof(event_t));
 	if (e == NULL)
 		return -1;
@@ -78,6 +79,7 @@ int dispatch_event(const struct audit_re
 	e->hdr.hlen = sizeof(struct audit_dispatcher_header);
 	e->hdr.type = rep->type;
 
+	// Network originating events have data at rep->message
 	if (protocol_ver == AUDISP_PROTOCOL_VER) {
 		e->hdr.size = rep->msg.nlh.nlmsg_len;
 		memcpy(e->data, (void*)rep->msg.data, e->hdr.size);
diff -urp audit-3.0.orig/src/auditd-event.c audit-3.0/src/auditd-event.c
--- audit-3.0.orig/src/auditd-event.c	2018-08-31 17:05:48.000000000 -0400
+++ audit-3.0/src/auditd-event.c	2018-12-06 20:17:09.769340037 -0500
@@ -225,8 +225,10 @@ static void replace_event_msg(struct aud
 			e->reply.message = strndup(buf, MAX_AUDIT_MESSAGE_LENGTH-1);
 			len = MAX_AUDIT_MESSAGE_LENGTH;
 		}
-		e->reply.msg.nlh.nlmsg_len = e->reply.len;
-		e->reply.len = len;
+		// For network originating events, len should be used
+		if (!from_network(e)) // V1 protocol msg size
+			e->reply.msg.nlh.nlmsg_len = e->reply.len;
+		e->reply.len = len; // V2 protocol msg size
 	}
 }
 
@@ -500,7 +502,7 @@ struct auditd_event *create_event(char *
 	e->sequence_id = sequence_id;
 
 	/* Network originating events need things adjusted to mimic netlink. */
-	if (e->ack_func)
+	if (from_network(e))
 		replace_event_msg(e, msg);
 
 	return e;
@@ -570,7 +572,7 @@ void handle_event(struct auditd_event *e
 static void send_ack(const struct auditd_event *e, int ack_type,
 			const char *msg)
 {
-	if (e->ack_func) {
+	if (from_network(e)) {
 		unsigned char header[AUDIT_RMW_HEADER_SIZE];
 
 		AUDIT_RMW_PACK_HEADER(header, 0, ack_type, strlen(msg),
diff -urp audit-3.0.orig/src/auditd-event.h audit-3.0/src/auditd-event.h
--- audit-3.0.orig/src/auditd-event.h	2018-08-31 17:05:48.000000000 -0400
+++ audit-3.0/src/auditd-event.h	2018-12-06 20:17:09.769340037 -0500
@@ -36,6 +36,9 @@ struct auditd_event {
 	unsigned long sequence_id;
 };
 
+static inline int from_network(const struct auditd_event *e) 
+{ if (e && e->ack_func) return 1; return 0; };
+
 #include "auditd-config.h"
 
 int dispatch_network_events(void);