Re: Refactoring src/ausearch-report.c:output_interpreted_node()

Burn Alting
2014-09-29T20:48:41Z

[-- Attachment #1: Type: text/plain, Size: 1384 bytes --]

And here is the patch that updates audit_name_to_msg_type()

Rgds

On Mon, 2014-09-29 at 12:41 +1000, Burn Alting wrote:
> Steve,
>
> In lib/lookup_table.c:audit_name_to_msg_type(), the event type value is
> parsed and converted to an integer as per,
>
> Given
> type=<type_value>
> then
> <type_value>
> is parsed for
> - a known string
> - a long integer number, n, found in the specific string
> "UNKNOWN[n]"
> - a long integer number, n, found in the specific string
> "n"
>
> In src/ausearch-report.c:output_interpreted_node() it additionally
> parses for a <type_value> of
> - a long integer number, n, found in the string "[^\[]*[n].*"
> i.e.
> type=something[n]something_else
>
> Is there any reason against adding this additional parsing into
> lib/lookup_table.c:audit_name_to_msg_type()?
>
> If we can, then output_interpreted_node() can be re-factored so we are
> not parsing the same data twice for every event.
>
> I am uncertain what effect of accepting this additional format would
> have when adding rules to the running audit system - i.e.
> audit_name_to_msg_type() is called by autrace/auditctl when parsing
> rules (ie the msgtype field name).
>
>
> Regards
>
> Burn
>
>
>
>
> --
> Linux-audit mailing list
> Linux-audit@redhat.com
> https://www.redhat.com/mailman/listinfo/linux-audit

[-- Attachment #2: audit-2.4_type_parsing.patch --]
[-- Type: text/x-patch, Size: 1188 bytes --]

diff -Npru audit-2.4/lib/lookup_table.c audit-2.4_type_parsing/lib/lookup_table.c
--- audit-2.4/lib/lookup_table.c 2014-08-25 02:39:27.000000000 +1000
+++ audit-2.4_type_parsing/lib/lookup_table.c 2014-09-29 12:54:22.555781561 +1000
@@ -224,23 +224,34 @@ const char *audit_action_to_name(int act
int audit_name_to_msg_type(const char *msg_type)
{
int rc;
+ char * bptr;

if (msg_type_s2i(msg_type, &rc) != 0)
return rc;

/* Take a stab at converting */
- if (strncmp(msg_type, "UNKNOWN[", 8) == 0) {
+ if ((bptr = strchr(msg_type, '['))) {
int len;
char buf[8];
- const char *end = strchr(msg_type + 8, ']');
+ const char *end;
+ /*
+ * First check for "type=UNKNOWN[", otherwise
+ * we accept anything before the '['
+ */
+ if (strncmp(msg_type, "UNKNOWN[", 8) == 0) {
+ bptr = (char *)msg_type + 8;
+ } else {
+ bptr++;
+ }
+ end = strchr(bptr, ']');
if (end == NULL)
return -1;

- len = end - (msg_type + 8);
+ len = end - bptr;
if (len > 7)
len = 7;
memset(buf, 0, sizeof(buf));
- strncpy(buf, msg_type + 8, len);
+ strncpy(buf, bptr, len);
errno = 0;
return strtol(buf, NULL, 10);
} else if (isdigit(*msg_type)) {

[-- Attachment #3: Type: text/plain, Size: 0 bytes --]