[Aide-commits] aide branch, master, updated. v0.16a2-41-g26e61d4
Brought to you by:
hvhaugwitz,
rvdb
From: Hannes v. H. <hvh...@us...> - 2016-03-28 20:53:17
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "aide". The branch, master has been updated via 26e61d40bcbee555d2f2eafc2068c49f70cd76a7 (commit) from eab0e0b03aaba81cdcb5d13485b4f9c91438aace (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 26e61d40bcbee555d2f2eafc2068c49f70cd76a7 Author: Hannes von Haugwitz <ha...@vo...> Date: Mon Mar 28 22:30:35 2016 +0200 Fix '.*'-rule matching and code cleanup diff --git a/ChangeLog b/ChangeLog index c2c2f5b..ff43029 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2016-03-28 Hannes von Haugwitz <ha...@vo...> + * Fix '.*'-rule matching and code cleanup + 2016-03-22 Hannes von Haugwitz <ha...@vo...> * Fix compilation issue with e2fsprogs 1.43 diff --git a/NEWS b/NEWS index 315c760..ae9e778 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ Version 0.16 (NOT_YET_RELEASED) * Enabled summarize_changes by default * Switch to PCRE library + * Fix '.*'-rule matching * Add new '--limit' parameter * Sort entries of database file * Compare database entries just once diff --git a/include/gen_list.h b/include/gen_list.h index f92ab5a..ed2b7b8 100644 --- a/include/gen_list.h +++ b/include/gen_list.h @@ -57,11 +57,9 @@ void populate_tree(seltree* tree); char* strrxtok(char*); -int check_list_for_match(list*,char*,DB_ATTR_TYPE*); +int check_rxtree(char* filename,seltree* tree, DB_ATTR_TYPE* attr, mode_t perm); -int check_rxtree(char* filename,seltree* tree, DB_ATTR_TYPE* attr); - -db_line* get_file_attrs(char* filename,DB_ATTR_TYPE attr); +db_line* get_file_attrs(char* filename,DB_ATTR_TYPE attr, struct AIDE_STAT_TYPE *fs); seltree* get_seltree_node(seltree* tree,char* path); diff --git a/src/db_disk.c b/src/db_disk.c index 2bb4db5..a1d5d58 100644 --- a/src/db_disk.c +++ b/src/db_disk.c @@ -171,6 +171,20 @@ void add_child (db_line * fil) r->childs = list_sorted_insert (r->childs, new_r, compare_node_by_path); } +static int get_file_status(char *filename, struct AIDE_STAT_TYPE *fs) { + int sres = 0; + sres = AIDE_LSTAT_FUNC(filename,fs); + if(sres == -1){ + char* er = strerror(errno); + if (er == NULL) { + error(0,"get_file_status: lstat() failed for %s. strerror() failed for %i\n", filename, errno); + } else { + error(0,"get_file_status: lstat() failed for %s: %s\n", filename, er); + } + } + return sres; +} + /* It might be a good idea to make this non recursive. Now implemented with goto-statement. Yeah, it's ugly and easy. @@ -182,6 +196,7 @@ db_line *db_readline_disk () DB_ATTR_TYPE attr; char *fullname; int add = 0; + struct AIDE_STAT_TYPE fs; /* root needs special handling */ if (!root_handled) { @@ -189,32 +204,23 @@ db_line *db_readline_disk () fullname=malloc((conf->root_prefix_length+2)*sizeof(char)); strncpy(fullname, conf->root_prefix, conf->root_prefix_length+1); strncat (fullname, "/", 1); - add = check_rxtree (&fullname[conf->root_prefix_length], conf->tree, &attr); + if (!get_file_status(&fullname[conf->root_prefix_length], &fs)) { + add = check_rxtree (&fullname[conf->root_prefix_length], conf->tree, &attr, fs.st_mode); error (240, "%s match=%d, tree=%p, attr=%llu\n", &fullname[conf->root_prefix_length], add, conf->tree, attr); if (add > 0) { - fil = get_file_attrs (fullname, attr); + fil = get_file_attrs (fullname, attr, &fs); error (240, "%s attr=%llu\n", &fullname[conf->root_prefix_length], attr); if (fil != NULL) { error (240, "%s attr=%llu\n", fil->filename, fil->attr); + return fil; } - - if (fil == NULL) { - /* - Something went wrong during read process -> - Let's try next one. - */ - free_db_line (fil); /* Filename is freeed? */ - free (fil); - fil = NULL; - } - return fil; - } else { - free (fullname); } + } + free (fullname); } recursion: next_in_dir (); @@ -244,29 +250,27 @@ recursion: If not call, db_readline_disk again... */ - add = check_rxtree (&fullname[conf->root_prefix_length], conf->tree, &attr); + if (get_file_status(&fullname[conf->root_prefix_length], &fs)) { + free (fullname); + goto recursion; + } + add = check_rxtree (&fullname[conf->root_prefix_length], conf->tree, &attr, fs.st_mode); error (240, "%s match=%d, tree=%p, attr=%llu\n", &fullname[conf->root_prefix_length], add, conf->tree, attr); if (add > 0) { - fil = get_file_attrs (fullname, attr); + fil = get_file_attrs (fullname, attr, &fs); error (240, "%s attr=%llu\n", &fullname[conf->root_prefix_length], attr); if (fil != NULL) { error (240, "%s attr=%llu\n", fil->filename, fil->attr); - } - /* - Hack. - */ - - if (fil == NULL) { + } else { /* Something went wrong during read process -> Let's try next one. */ - free_db_line (fil); /* Filename is freeed? */ - fil = NULL; + free (fullname); goto recursion; // return db_readline_disk(db); } diff --git a/src/gen_list.c b/src/gen_list.c index a21dd80..c18ef4d 100644 --- a/src/gen_list.c +++ b/src/gen_list.c @@ -546,19 +546,23 @@ void gen_seltree(list* rxlist,seltree* tree,char type) } } -int check_list_for_match(list* rxrlist,char* text,DB_ATTR_TYPE* attr) +static int check_list_for_match(list* rxrlist,char* text,DB_ATTR_TYPE* attr) { list* r=NULL; int retval=1; + int pcre_retval; pcre_extra *pcre_extra = NULL; for(r=rxrlist;r;r=r->next){ - retval=pcre_exec((pcre*)((rx_rule*)r->data)->crx, pcre_extra, text, strlen(text), 0, 0, NULL, 0); - if (retval >= 0) { + pcre_retval=pcre_exec((pcre*)((rx_rule*)r->data)->crx, pcre_extra, text, strlen(text), 0, PCRE_PARTIAL_SOFT, NULL, 0); + if (pcre_retval >= 0) { *attr=((rx_rule*)r->data)->attr; - error(231,"\"%s\" matches rule from line #%ld: %s\n",text,((rx_rule*)r->data)->conf_lineno,((rx_rule*)r->data)->rx); - break; + error(231,"\"%s\" matches (pcre_exec return value: %i) rule from line #%ld: %s\n",text, pcre_retval, ((rx_rule*)r->data)->conf_lineno,((rx_rule*)r->data)->rx); + return 0; + } else if (pcre_retval == PCRE_ERROR_PARTIAL) { + error(232,"\"%s\" PARTIAL matches (pcre_exec return value: %i) rule from line #%ld: %s\n",text, pcre_retval, ((rx_rule*)r->data)->conf_lineno,((rx_rule*)r->data)->rx); + retval=-1; } else { - error(232,"\"%s\" doesn't match (return value: %i) rule from line #%ld: %s\n",text, retval,((rx_rule*)r->data)->conf_lineno,((rx_rule*)r->data)->rx); + error(232,"\"%s\" doesn't match (pcre_exec return value: %i) rule from line #%ld: %s\n",text, pcre_retval,((rx_rule*)r->data)->conf_lineno,((rx_rule*)r->data)->rx); } } return retval; @@ -580,7 +584,7 @@ int check_list_for_match(list* rxrlist,char* text,DB_ATTR_TYPE* attr) *16, this is a recursed call */ -int check_node_for_match(seltree*node,char*text,int retval,DB_ATTR_TYPE* attr) +static int check_node_for_match(seltree*node,char*text, mode_t perm, int retval,DB_ATTR_TYPE* attr) { int top=0; @@ -594,8 +598,17 @@ int check_node_for_match(seltree*node,char*text,int retval,DB_ATTR_TYPE* attr) top=1; retval|=16; - if(!check_list_for_match(node->equ_rx_lst,text,attr)){ - retval|=2|4; + switch (check_list_for_match(node->equ_rx_lst,text,attr)) { + case 0: { + error(220, "check_node_for_match: equal match for '%s'\n", text); + retval|=2|4; + } + case -1: { + if(S_ISDIR(perm) && get_seltree_node(node,text)==NULL) { + error(220, "check_node_for_match: creating new seltree node for '%s'\n", text); + new_seltree_node(node,text,0,NULL); + } + } } } /* We'll use retval to pass information on whether to recurse @@ -604,18 +617,29 @@ int check_node_for_match(seltree*node,char*text,int retval,DB_ATTR_TYPE* attr) /* If 4 and 8 are not set, we will check for matches */ if(!(retval&(4|8))){ - if(!check_list_for_match(node->sel_rx_lst,text,attr)) - retval|=1|8; + switch (check_list_for_match(node->sel_rx_lst,text,attr)) { + case 0: { + error(220, "check_node_for_match: selective match for '%s'\n", text); + retval|=1|8; + } + case -1: { + if(S_ISDIR(perm) && get_seltree_node(node,text)==NULL) { + error(220, "check_node_for_match: creating new seltree node for '%s'\n", text); + new_seltree_node(node,text,0,NULL); + } + } + } } /* Now let's check the ancestors */ - retval=check_node_for_match(node->parent,text,retval,attr); + retval=check_node_for_match(node->parent,text, perm, retval,attr); /* Negative regexps are the strongest so they are checked last */ /* If this file is to be added */ if(retval){ if(!check_list_for_match(node->neg_rx_lst,text,attr)){ + error(220, "check_node_for_match: negative match for '%s'\n", text); retval=0; } } @@ -910,7 +934,7 @@ static void add_file_to_tree(seltree* tree,db_line* file,int db, } } -int check_rxtree(char* filename,seltree* tree,DB_ATTR_TYPE* attr) +int check_rxtree(char* filename,seltree* tree,DB_ATTR_TYPE* attr, mode_t perm) { int retval=0; char * tmp=NULL; @@ -935,7 +959,7 @@ int check_rxtree(char* filename,seltree* tree,DB_ATTR_TYPE* attr) error(220, "check_rxtree: %s does match limit: %s\n", filename, conf->limit); } else if (retval == PCRE_ERROR_PARTIAL) { error(220, "check_rxtree: %s does PARTIAL match limit: %s\n", filename, conf->limit); - if(get_seltree_node(tree,filename)==NULL){ + if(S_ISDIR(perm) && get_seltree_node(tree,filename)==NULL){ error(220, "check_rxtree: creating new seltree node for '%s'\n", filename); new_seltree_node(tree,filename,0,NULL); } @@ -949,32 +973,21 @@ int check_rxtree(char* filename,seltree* tree,DB_ATTR_TYPE* attr) pnode=get_seltree_node(tree,parentname); *attr=0; - retval=check_node_for_match(pnode,filename,0,attr); + retval=check_node_for_match(pnode,filename, perm, 0,attr); free(parentname); return retval; } -db_line* get_file_attrs(char* filename,DB_ATTR_TYPE attr) +db_line* get_file_attrs(char* filename,DB_ATTR_TYPE attr, struct AIDE_STAT_TYPE *fs) { - struct AIDE_STAT_TYPE fs; int sres=0; db_line* line=NULL; time_t cur_time; - - sres=AIDE_LSTAT_FUNC(filename,&fs); - if(sres==-1){ - char* er=strerror(errno); - if (er==NULL) { - error(0,"lstat() failed for %s. strerror failed for %i\n",filename,errno); - } else { - error(0,"lstat() failed for %s:%s\n",filename,strerror(errno)); - } - return NULL; - } + if(!(attr&DB_RDEV)) - fs.st_rdev=0; + fs->st_rdev=0; /* Get current time for future time notification. */ @@ -989,13 +1002,13 @@ db_line* get_file_attrs(char* filename,DB_ATTR_TYPE attr) } } else { - if(fs.st_atime>cur_time){ + if(fs->st_atime>cur_time){ error(CLOCK_SKEW,_("%s atime in future\n"),filename); } - if(fs.st_mtime>cur_time){ + if(fs->st_mtime>cur_time){ error(CLOCK_SKEW,_("%s mtime in future\n"),filename); } - if(fs.st_ctime>cur_time){ + if(fs->st_ctime>cur_time){ error(CLOCK_SKEW,_("%s ctime in future\n"),filename); } } @@ -1020,8 +1033,8 @@ db_line* get_file_attrs(char* filename,DB_ATTR_TYPE attr) line->fullpath=filename; line->filename=&filename[conf->root_prefix_length]; - line->perm_o=fs.st_mode; - line->size_o=fs.st_size; + line->perm_o=fs->st_mode; + line->size_o=fs->st_size; line->linkname=NULL; /* @@ -1034,7 +1047,7 @@ db_line* get_file_attrs(char* filename,DB_ATTR_TYPE attr) Set normal part */ - fs2db_line(&fs,line); + fs2db_line(fs,line); /* ACL stuff @@ -1056,8 +1069,8 @@ db_line* get_file_attrs(char* filename,DB_ATTR_TYPE attr) e2fsattrs2line(line); #endif - if (attr&DB_HASHES && S_ISREG(fs.st_mode)) { - calc_md(&fs,line); + if (attr&DB_HASHES && S_ISREG(fs->st_mode)) { + calc_md(fs,line); } else { /* We cannot calculate hash for nonfile. @@ -1111,7 +1124,7 @@ void populate_tree(seltree* tree) if((node=get_seltree_node(tree,new->filename))==NULL){ node=new_seltree_node(tree,new->filename,0,NULL); } - if((add=check_rxtree(new->filename,tree,&attr))>0){ + if((add=check_rxtree(new->filename,tree,&attr, new->perm))>0){ add_file_to_tree(tree,new,DB_NEW,attr); } else { free_db_line(new); @@ -1135,7 +1148,7 @@ void populate_tree(seltree* tree) if((node=get_seltree_node(tree,old->filename))==NULL){ node=new_seltree_node(tree,old->filename,0,NULL); } - add=check_rxtree(old->filename,tree,&attr); + add=check_rxtree(old->filename,tree,&attr, old->perm); if(add > 0) { add_file_to_tree(tree,old,DB_OLD,attr); } else if (conf->limit!=NULL && add < 0) { ----------------------------------------------------------------------- Summary of changes: ChangeLog | 3 ++ NEWS | 1 + include/gen_list.h | 6 +-- src/db_disk.c | 54 ++++++++++++++++-------------- src/gen_list.c | 91 +++++++++++++++++++++++++++++---------------------- 5 files changed, 87 insertions(+), 68 deletions(-) hooks/post-receive -- aide |