audit: pass and reuse NMStrBuf for build_message()

build_message() is an internal helper function with a very specific
purpose.

Let's change it to take an NMStrBuf argument for generating
the string. The advantage is that we don't need to allocate and
free the buffers in between, but can just reuse it.
This commit is contained in:
Thomas Haller
2021-04-09 16:54:05 +02:00
parent c82b7c94c0
commit a5dfc46176

View File

@@ -110,11 +110,16 @@ _audit_field_init_uint64(AuditField *field, const char *name, guint64 val, Audit
};
}
static char *
build_message(GPtrArray *fields, AuditBackend backend)
static const char *
build_message(NMStrBuf *strbuf, AuditBackend backend, GPtrArray *fields)
{
NMStrBuf strbuf = NM_STR_BUF_INIT(NM_UTILS_GET_NEXT_REALLOC_SIZE_232, FALSE);
guint i;
guint i;
if (strbuf->len == 0) {
/* preallocate a large buffer... */
nm_str_buf_maybe_expand(strbuf, NM_UTILS_GET_NEXT_REALLOC_SIZE_232, FALSE);
} else
nm_str_buf_reset(strbuf);
for (i = 0; i < fields->len; i++) {
const AuditField *field = fields->pdata[i];
@@ -122,7 +127,7 @@ build_message(GPtrArray *fields, AuditBackend backend)
if (!NM_FLAGS_ANY(field->backends, backend))
continue;
nm_str_buf_append_required_delimiter(&strbuf, ' ');
nm_str_buf_append_required_delimiter(strbuf, ' ');
if (field->value_type == NM_VALUE_TYPE_STRING) {
const char *str = field->value.v_string;
@@ -133,19 +138,19 @@ build_message(GPtrArray *fields, AuditBackend backend)
gs_free char *value = NULL;
value = audit_encode_nv_string(field->name, str, 0);
nm_str_buf_append(&strbuf, value);
nm_str_buf_append(strbuf, value);
} else
nm_str_buf_append_printf(&strbuf, "%s=%s", field->name, str);
nm_str_buf_append_printf(strbuf, "%s=%s", field->name, str);
continue;
}
#endif /* HAVE_LIBAUDIT */
nm_str_buf_append_printf(&strbuf, "%s=\"%s\"", field->name, str);
nm_str_buf_append_printf(strbuf, "%s=\"%s\"", field->name, str);
continue;
}
if (field->value_type == NM_VALUE_TYPE_UINT64) {
nm_str_buf_append_printf(&strbuf,
nm_str_buf_append_printf(strbuf,
"%s=%" G_GUINT64_FORMAT,
field->name,
field->value.v_uint64);
@@ -155,7 +160,7 @@ build_message(GPtrArray *fields, AuditBackend backend)
g_return_val_if_reached(NULL);
}
return nm_str_buf_finalize(&strbuf, NULL);
return nm_str_buf_get_str(strbuf);
}
static void
@@ -166,10 +171,10 @@ nm_audit_log(NMAuditManager *self,
const char * func,
gboolean success)
{
nm_auto_str_buf NMStrBuf strbuf = NM_STR_BUF_INIT(0, FALSE);
#if HAVE_LIBAUDIT
NMAuditManagerPrivate *priv;
#endif
char *msg;
g_return_if_fail(NM_IS_AUDIT_MANAGER(self));
@@ -177,14 +182,17 @@ nm_audit_log(NMAuditManager *self,
priv = NM_AUDIT_MANAGER_GET_PRIVATE(self);
if (priv->auditd_fd >= 0) {
msg = build_message(fields, BACKEND_AUDITD);
audit_log_user_message(priv->auditd_fd, AUDIT_USYS_CONFIG, msg, NULL, NULL, NULL, success);
g_free(msg);
audit_log_user_message(priv->auditd_fd,
AUDIT_USYS_CONFIG,
build_message(&strbuf, BACKEND_AUDITD, fields),
NULL,
NULL,
NULL,
success);
}
#endif
if (nm_logging_enabled(AUDIT_LOG_LEVEL, LOGD_AUDIT)) {
msg = build_message(fields, BACKEND_LOG);
_nm_log_full(file,
line,
func,
@@ -196,8 +204,7 @@ nm_audit_log(NMAuditManager *self,
NULL,
"%s%s",
_NMLOG_PREFIX_NAME ": ",
msg);
g_free(msg);
build_message(&strbuf, BACKEND_LOG, fields));
}
}