diff -urp audit-3.0.orig/src/ausearch-parse.c audit-3.0/src/ausearch-parse.c --- audit-3.0.orig/src/ausearch-parse.c 2019-03-15 15:30:39.000000000 -0400 +++ audit-3.0/src/ausearch-parse.c 2019-04-16 16:08:52.862402589 -0400 @@ -49,7 +49,7 @@ static int parse_dir(const lnode *n, sea static int common_path_parser(search_items *s, char *path); static int avc_parse_path(const lnode *n, search_items *s); static int parse_path(const lnode *n, search_items *s); -static int parse_user(const lnode *n, search_items *s); +static int parse_user(const lnode *n, search_items *s, anode *avc); static int parse_obj(const lnode *n, search_items *s); static int parse_login(const lnode *n, search_items *s); static int parse_daemon1(const lnode *n, search_items *s); @@ -105,7 +105,7 @@ int extract_search_items(llist *l) case AUDIT_FIRST_USER_MSG...AUDIT_USER_END: case AUDIT_USER_CHAUTHTOK...AUDIT_LAST_USER_MSG: case AUDIT_FIRST_USER_MSG2...AUDIT_LAST_USER_MSG2: - ret = parse_user(n, s); + ret = parse_user(n, s, NULL); break; case AUDIT_SOCKADDR: ret = parse_sockaddr(n, s); @@ -830,7 +830,7 @@ static int parse_obj(const lnode *n, sea return 0; } -static int parse_user(const lnode *n, search_items *s) +static int parse_user(const lnode *n, search_items *s, anode *avc) { char *ptr, *str, *term, saved, *mptr; @@ -915,7 +915,10 @@ static int parse_user(const lnode *n, se if (term == NULL) return 12; *term = 0; - if (audit_avc_init(s) == 0) { + if (avc) { + avc->scontext = strdup(str); + *term = ' '; + } else if (audit_avc_init(s) == 0) { anode an; anode_init(&an); @@ -926,6 +929,31 @@ static int parse_user(const lnode *n, se return 13; } } + // optionally get tcontext + if (avc && event_object) { + // USER_AVC tcontext + str = strstr(term, "tcontext="); + if (str != NULL) { + str += 9; + term = strchr(str, ' '); + if (term) { + *term = 0; + avc->tcontext = strdup(str); + *term = ' '; + } + } + // Grab tclass if it exists + str = strstr(term, "tclass="); + if (str) { + str += 7; + term = strchr(str, ' '); + if (term) { + *term = 0; + avc->avc_class = strdup(str); + *term = ' '; + } + } + } // optionally get gid if (event_gid != -1) { if (n->type == AUDIT_ADD_GROUP || n->type == AUDIT_DEL_GROUP || @@ -1880,7 +1908,7 @@ static int parse_avc(const lnode *n, sea other_avc: // User AVC's are not formatted like a kernel AVC if (n->type == AUDIT_USER_AVC) { - rc = parse_user(n, s); + rc = parse_user(n, s, &an); if (rc > 20) rc = 0; if (audit_avc_init(s) == 0) { diff -urp audit-3.0.orig/src/ausearch-string.c audit-3.0/src/ausearch-string.c --- audit-3.0.orig/src/ausearch-string.c 2019-03-15 15:30:39.000000000 -0400 +++ audit-3.0/src/ausearch-string.c 2019-04-16 15:55:39.186487759 -0400 @@ -118,6 +118,9 @@ int slist_add_if_uniq(slist *l, const ch snode sn; register snode *cur; + if (str == NULL) + return -1; + cur = l->head; while (cur) { if (strcmp(str, cur->str) == 0) {