PERFORCE change 73905 for review

Wayne Salamon wsalamon at FreeBSD.org
Sun Mar 27 01:58:59 GMT 2005


http://perforce.freebsd.org/chv.cgi?CH=73905

Change 73905 by wsalamon at rickenbacker on 2005/03/27 01:58:31

	Add a new trigger for the hard limit on disk space. 'Hard' means there
	are very few blocks left, and the audit daemon needs to take action.
	I am staging this change in two pieces: First the basics, not tested
	yet. Next, possible have the kernel suspend auditing when the hard
	limit is reached.

Affected files ...

.. //depot/projects/trustedbsd/audit3/contrib/audit_supt/auditd/auditd.c#9 edit
.. //depot/projects/trustedbsd/audit3/sys/bsm/audit.h#11 edit
.. //depot/projects/trustedbsd/audit3/sys/security/audit/kern_audit.c#18 edit

Differences ...

==== //depot/projects/trustedbsd/audit3/contrib/audit_supt/auditd/auditd.c#9 (text+ko) ====

@@ -471,17 +471,16 @@
 				syslog(LOG_ERR, "Error swapping audit file\n");
 			}
 
-				/* 
-				 * check if the next dir has already reached its 
-				 * soft limit
-				 */
-				dirent = TAILQ_FIRST(&dir_q);
-				if(dirent->softlim == 1)  {
-					/* all dirs have reached their soft limit */
-					audit_warn_allsoft();
-				}
+			/* 
+			 * check if the next dir has already reached its 
+			 * soft limit
+			 */
+			dirent = TAILQ_FIRST(&dir_q);
+			if(dirent->softlim == 1)  {
+				/* all dirs have reached their soft limit */
+				audit_warn_allsoft();
 			}
-		else {
+		} else {
 			/* 
 			 * Continue auditing to the current file
 			 * Also generate  an allsoft warning
@@ -491,13 +490,29 @@
 		}
 		break;
 
+	case AUDITD_TRIGGER_NO_SPACE:
+		syslog(LOG_INFO, "Got no space trigger\n");
+
+		/* delete current dir, go on to next */
+		TAILQ_REMOVE(&dir_q, dirent, dirs);
+		audit_warn_hard(dirent->dirname);
+		free(dirent->dirname);
+		free(dirent);
+
+		if(swap_audit_file() == -1)
+			syslog(LOG_ERR, "Error swapping audit file\n");	
+
+		/* We are out of log directories */
+		audit_warn_allhard(++allhardcount);
+		
+		break;
+
 	case AUDITD_TRIGGER_OPEN_NEW :
 		syslog(LOG_INFO, "Got open new trigger\n");
 		/* create a new file and swap with the one being 
 		 * used in kernel */
-		if(swap_audit_file() == -1) {
+		if(swap_audit_file() == -1)
 			syslog(LOG_ERR, "Error swapping audit file\n");	
-		}
 		break;
 
 	case AUDITD_TRIGGER_READ_FILE :

==== //depot/projects/trustedbsd/audit3/sys/bsm/audit.h#11 (text+ko) ====

@@ -44,6 +44,11 @@
  */
 #define AUDITD_TRIGGER_FILE	"/dev/audit"
 
+/*
+ * Minimum noumber of free blocks on the filesystem containing the audit
+ * log necessary to avoid a hard log rotation.
+ */
+#define AUDIT_HARD_LIMIT_FREE_BLOCKS	16
 /* 
  * Triggers for the audit daemon
  */
@@ -51,6 +56,7 @@
 #define AUDITD_TRIGGER_OPEN_NEW 	2
 #define AUDITD_TRIGGER_READ_FILE 	3
 #define AUDITD_TRIGGER_CLOSE_AND_DIE 	4
+#define AUDITD_TRIGGER_NO_SPACE		5
 
 /*
  * Pre-defined audit IDs

==== //depot/projects/trustedbsd/audit3/sys/security/audit/kern_audit.c#18 (text+ko) ====

@@ -323,7 +323,6 @@
     struct ucred *cred, struct thread *td)
 {
 	int ret;
-	int trigger;
 	long temp;
 	struct au_record *bsm;
 	struct vattr vattr;
@@ -357,24 +356,34 @@
 	 */
 
 	/* 
-	 * If we fall below percent free blocks, then trigger the
-	 * audit daemon to do something about it.
+	 * If we fall below minimum free blocks (hard limit), tell the audit
+	 * daemon to force a rotation off of the file system. If we fall 
+	 * below the minimum percent free blocks (soft limit), then kindly 
+	 * suggest to the audit daemon to do something.
 	 */
-	if (audit_qctrl.aq_minfree != 0) {
-		temp = mnt_stat->f_blocks / (100 / audit_qctrl.aq_minfree);
-		if (mnt_stat->f_bfree < temp) {
-			trigger = AUDITD_TRIGGER_LOW_SPACE;
-			ret = send_trigger(AUDITD_TRIGGER_LOW_SPACE);
-			if (ret != 0) {
-				printf(
-    "Failed audit_triggers(AUDIT_TRIGGER_LOW_SPACE): %d\n", ret);
+	if (mnt_stat->f_bfree < AUDIT_HARD_LIMIT_FREE_BLOCKS) {
+		ret = send_trigger(AUDITD_TRIGGER_NO_SPACE);
+		if (ret != 0) {
+			printf(
+    "Failed audit_triggers(AUDIT_TRIGGER_NO_SPACE): %d\n", ret);
 			/*
 			 * XXX: What to do here? Disable auditing?
 			 * panic?
 			 */
+		}
+	} else
+		if (audit_qctrl.aq_minfree != 0) {
+			temp = mnt_stat->f_blocks / (100 / 
+			    audit_qctrl.aq_minfree);
+			if (mnt_stat->f_bfree < temp) {
+				ret = send_trigger(AUDITD_TRIGGER_LOW_SPACE);
+				if (ret != 0) {
+					printf(
+    "Failed audit_triggers(AUDIT_TRIGGER_LOW_SPACE): %d\n", ret);
+				}
 			}
 		}
-	}
+
 	/* Check if the current log file is full; if so, call for
 	 * a log rotate. This is not an exact comparison; we may
 	 * write some records over the limit. If that's not
@@ -384,7 +393,6 @@
 	    (audit_file_rotate_wait == 0) && 
 	    (vattr.va_size >= audit_fstat.af_filesz)) {
 		audit_file_rotate_wait = 1;
-		trigger = AUDITD_TRIGGER_OPEN_NEW;
 		ret = send_trigger(AUDITD_TRIGGER_OPEN_NEW);
 		if (ret != 0) {
 			printf(
To Unsubscribe: send mail to majordomo at trustedbsd.org
with "unsubscribe trustedbsd-cvs" in the body of the message



More information about the trustedbsd-cvs mailing list