Skip newlines for SELinux logs am: 366f01fd64 am: 273398f7b8 am: 829be6bea0

Original change: https://android-review.googlesource.com/c/platform/external/selinux/+/2519660

Change-Id: Ib80972ee47715b990e2d47fd5dc1535438f643b8
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/libselinux/src/android/android.c b/libselinux/src/android/android.c
index c883c7a..ab0a15f 100644
--- a/libselinux/src/android/android.c
+++ b/libselinux/src/android/android.c
@@ -176,57 +176,55 @@
 	return context_handle(SELABEL_CTX_ANDROID_KEYSTORE2_KEY, &keystore2_context_paths, "keystore2");
 }
 
+static void __selinux_log_callback(bool add_to_event_log, int type, const char *fmt, va_list ap) {
+	int priority;
+	char *strp;
+
+	switch(type) {
+	case SELINUX_WARNING:
+		priority = ANDROID_LOG_WARN;
+		break;
+	case SELINUX_INFO:
+		priority = ANDROID_LOG_INFO;
+		break;
+	default:
+		priority = ANDROID_LOG_ERROR;
+		break;
+	}
+
+	int len = vasprintf(&strp, fmt, ap);
+	if (len < 0) {
+		return;
+	}
+
+	/* libselinux log messages usually contain a new line character, while
+	 * Android LOG() does not expect it. Remove it to avoid empty lines in
+	 * the log buffers.
+	 */
+	if (len > 0 && strp[len - 1] == '\n') {
+		strp[len - 1] = '\0';
+	}
+	LOG_PRI(priority, "SELinux", "%s", strp);
+	if (add_to_event_log) {
+		LOG_EVENT_STRING(AUDITD_LOG_TAG, strp);
+	}
+	free(strp);
+}
+
 int selinux_log_callback(int type, const char *fmt, ...)
 {
-    va_list ap;
-    int priority;
-    char *strp;
-
-    switch(type) {
-    case SELINUX_WARNING:
-        priority = ANDROID_LOG_WARN;
-        break;
-    case SELINUX_INFO:
-        priority = ANDROID_LOG_INFO;
-        break;
-    default:
-        priority = ANDROID_LOG_ERROR;
-        break;
-    }
-
-    va_start(ap, fmt);
-    if (vasprintf(&strp, fmt, ap) != -1) {
-        LOG_PRI(priority, "SELinux", "%s", strp);
-        LOG_EVENT_STRING(AUDITD_LOG_TAG, strp);
-        free(strp);
-    }
-    va_end(ap);
-    return 0;
+	va_list ap;
+	va_start(ap, fmt);
+	__selinux_log_callback(true, type, fmt, ap);
+	va_end(ap);
+	return 0;
 }
 
 int selinux_vendor_log_callback(int type, const char *fmt, ...)
 {
-    va_list ap;
-    int priority;
-    char *strp;
-
-    switch(type) {
-    case SELINUX_WARNING:
-        priority = ANDROID_LOG_WARN;
-        break;
-    case SELINUX_INFO:
-        priority = ANDROID_LOG_INFO;
-        break;
-    default:
-        priority = ANDROID_LOG_ERROR;
-        break;
-    }
-
-    va_start(ap, fmt);
-    if (vasprintf(&strp, fmt, ap) != -1) {
-        LOG_PRI(priority, "SELinux", "%s", strp);
-        free(strp);
-    }
-    va_end(ap);
-    return 0;
+	va_list ap;
+	va_start(ap, fmt);
+	__selinux_log_callback(false, type, fmt, ap);
+	va_end(ap);
+	return 0;
 }