2008-08-07 12:40:41 +00:00
/*
2015-09-17 13:41:26 -04:00
* Copyright ( C ) 2015 Cisco Systems , Inc . and / or its affiliates . All rights reserved .
2008-08-07 12:40:41 +00:00
* Copyright ( C ) 2008 Sourcefire , Inc .
*
* Authors : Tomasz Kojm
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston ,
* MA 02110 - 1301 , USA .
*/
# if HAVE_CONFIG_H
# include "clamav-config.h"
# endif
# include <check.h>
# include <stdio.h>
2008-08-21 20:21:43 +00:00
# include <string.h>
2008-08-07 12:40:41 +00:00
# include "../libclamav/clamav.h"
# include "../libclamav/readdb.h"
# include "../libclamav/matcher.h"
# include "../libclamav/matcher-ac.h"
# include "../libclamav/matcher-bm.h"
2015-06-03 15:28:39 -04:00
# include "../libclamav/matcher-pcre.h"
2010-02-09 12:01:31 +02:00
# include "../libclamav/others.h"
2008-12-29 17:55:30 +00:00
# include "../libclamav/default.h"
2008-08-07 12:40:41 +00:00
# include "checks.h"
static const struct ac_testdata_s {
const char * data ;
const char * hexsig ;
const char * virname ;
} ac_testdata [ ] = {
/* IMPORTANT: ac_testdata[i].hexsig should only match ac_testdata[i].data */
2015-06-03 15:28:39 -04:00
{ " daaaaaaaaddbbbbbcce " , " 64[4-4]61616161{2}6262[3-6]65 " , " Test_1: anchored and ranged wildcard " } ,
{ " ebbbbbbbbeecccccddf " , " 6262(6162|6364|6265|6465){2}6363 " , " Test_2: multi-byte fixed alternate w/ ranged wild " } ,
{ " aaaabbbbcccccdddddeeee " , " 616161*63636363*6565 " , " Test_3: unbounded wildcards " } ,
{ " oprstuwxy " , " 6f??727374????7879 " , " Test_4: nibble wildcards " } ,
{ " abdcabcddabccadbbdbacb " , " 6463{2-3}64646162(63|64|65)6361*6462????6261{-1}6362 " , " Test_5: various wildcard combinations w/ alternate " } ,
{ " abcdefghijkabcdefghijk " , " 62????65666768*696a6b6162{2-3}656667[1-3]6b " , " Test_6: various wildcard combinations " } ,
{ " abcadbabcadbabcacb " , " 6?6164?26?62{3}?26162?361 " , " Test_7: nibble and ranged wildcards " } ,
2010-02-09 12:01:31 +02:00
/* testcase for filter bug: it was checking only first 32 chars, and last
* maxpatlen */
2015-06-03 15:28:39 -04:00
{ " \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 dddddddddddddddddddd5 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 \1 " , " 6464646464646464646464646464646464646464(35|36) " , " Test_8: filter bug " } ,
2008-08-07 12:40:41 +00:00
2015-07-07 14:02:57 -04:00
/* altbyte */
{ " aabaa " , " 6161(62|63|64)6161 " , " Ac_Altstr_Test_1 " } , /* control */
{ " aacaa " , " 6161(62|63|64)6161 " , " Ac_Altstr_Test_1 " } , /* control */
{ " aadaa " , " 6161(62|63|64)6161 " , " Ac_Altstr_Test_1 " } , /* control */
/* alt-fstr */
{ " aabbbaa " , " 6161(626262|636363|646464)6161 " , " Ac_Altstr_Test_2 " } , /* control */
{ " aacccaa " , " 6161(626262|636363|646464)6161 " , " Ac_Altstr_Test_2 " } , /* control */
{ " aadddaa " , " 6161(626262|636363|646464)6161 " , " Ac_Altstr_Test_2 " } , /* control */
/* alt-vstr */
{ " aabbaa " , " 6161(6262|63636363|6464646464)6161 " , " Ac_Altstr_Test_3 " } , /* control */
{ " aaccccaa " , " 6161(6262|63636363|6464646464)6161 " , " Ac_Altstr_Test_3 " } , /* control */
{ " aadddddaa " , " 6161(6262|63636363|6464646464)6161 " , " Ac_Altstr_Test_3 " } , /* control */
/* alt-embed */
{ " aajjaa " , " 6161(6a6a|66(6767|6868)66|6969)6161 " , " Ac_Altstr_Test_4 " } , /* control */
{ " aafggfaa " , " 6161(6a6a|66(6767|6868)66|6969)6161 " , " Ac_Altstr_Test_4 " } , /* control */
{ " aafhhfaa " , " 6161(6a6a|66(6767|6868)66|6969)6161 " , " Ac_Altstr_Test_4 " } , /* control */
{ " aaiiaa " , " 6161(6a6a|66(6767|6868)66|6969)6161 " , " Ac_Altstr_Test_4 " } , /* control */
2015-06-03 15:28:39 -04:00
{ NULL , NULL , NULL }
2008-08-07 12:40:41 +00:00
} ;
2015-06-09 11:12:20 -04:00
static const struct ac_sigopts_testdata_s {
const char * data ;
uint32_t dlength ;
const char * hexsig ;
const char * offset ;
const uint16_t sigopts ;
const char * virname ;
const uint8_t expected_result ;
} ac_sigopts_testdata [ ] = {
/* nocase */
{ " aaaaa " , 5 , " 6161616161 " , " * " , ACPATT_OPTION_NOOPTS , " AC_Sigopts_Test_1 " , CL_VIRUS } , /* control */
{ " bBbBb " , 5 , " 6262626262 " , " * " , ACPATT_OPTION_NOOPTS , " AC_Sigopts_Test_2 " , CL_CLEAN } , /* nocase control */
{ " cCcCc " , 5 , " 6363636363 " , " * " , ACPATT_OPTION_NOCASE , " AC_Sigopts_Test_3 " , CL_VIRUS } , /* nocase test */
/* fullword */
{ " ddddd&e " , 7 , " 6464646464 " , " * " , ACPATT_OPTION_FULLWORD , " AC_Sigopts_Test_4 " , CL_VIRUS } , /* fullword start */
{ " s&eeeee&e " , 9 , " 6565656565 " , " * " , ACPATT_OPTION_FULLWORD , " AC_Sigopts_Test_5 " , CL_VIRUS } , /* fullword middle */
{ " s&fffff " , 7 , " 6666666666 " , " * " , ACPATT_OPTION_FULLWORD , " AC_Sigopts_Test_6 " , CL_VIRUS } , /* fullword end */
{ " sggggg " , 6 , " 6767676767 " , " * " , ACPATT_OPTION_FULLWORD , " AC_Sigopts_Test_7 " , CL_CLEAN } , /* fullword fail start */
{ " hhhhhe " , 6 , " 6868686868 " , " * " , ACPATT_OPTION_FULLWORD , " AC_Sigopts_Test_8 " , CL_CLEAN } , /* fullword fail end */
{ " iiiii " , 5 , " (W)6969696969 " , " * " , ACPATT_OPTION_NOOPTS , " AC_Sigopts_Test_9 " , CL_VIRUS } , /* fullword class start */
{ " jjj&jj " , 6 , " 6a6a6a(W)6a6a " , " * " , ACPATT_OPTION_NOOPTS , " AC_Sigopts_Test_10 " , CL_VIRUS } , /* fullword class middle */
{ " kkkkk " , 5 , " 6b6b6b6b6b(W) " , " * " , ACPATT_OPTION_NOOPTS , " AC_Sigopts_Test_11 " , CL_VIRUS } , /* fullword class end */
{ " slllll " , 6 , " (W)6c6c6c6c6c " , " * " , ACPATT_OPTION_NOOPTS , " AC_Sigopts_Test_12 " , CL_CLEAN } , /* fullword fail start */
{ " mmmmme " , 6 , " 6d6d6d6d6d(W) " , " * " , ACPATT_OPTION_NOOPTS , " AC_Sigopts_Test_13 " , CL_CLEAN } , /* fullword class end */
{ " nNnNn " , 5 , " 6e6e6e6e6e " , " * " , ACPATT_OPTION_NOCASE | ACPATT_OPTION_FULLWORD , " AC_Sigopts_Test_14 " , CL_VIRUS } , /* nocase fullword */
{ " soOoOo " , 6 , " 6f6f6f6f6f " , " * " , ACPATT_OPTION_NOCASE | ACPATT_OPTION_FULLWORD , " AC_Sigopts_Test_15 " , CL_CLEAN } , /* nocase fullword start fail */
{ " pPpPpe " , 6 , " 7070707070 " , " * " , ACPATT_OPTION_NOCASE | ACPATT_OPTION_FULLWORD , " AC_Sigopts_Test_16 " , CL_CLEAN } , /* nocase fullword end fail */
/* wide */
{ " q \0 q \0 q \0 q \0 q \0 " , 10 , " 7171717171 " , " * " , ACPATT_OPTION_WIDE , " AC_Sigopts_Test_17 " , CL_VIRUS } , /* control */
{ " r \0 R \0 r \0 R \0 r \0 " , 10 , " 7272727272 " , " * " , ACPATT_OPTION_WIDE | ACPATT_OPTION_NOCASE , " AC_Sigopts_Test_18 " , CL_VIRUS } , /* control */
{ " s \0 s \0 s \0 s \0 s \0 " , 10 , " 7373737373 " , " * " , ACPATT_OPTION_WIDE | ACPATT_OPTION_FULLWORD , " AC_Sigopts_Test_19 " , CL_VIRUS } , /* control */
{ " t \0 t \0 t \0 t \0 t \0 " , 10 , " 7474747474 " , " * " , ACPATT_OPTION_WIDE | ACPATT_OPTION_ASCII , " AC_Sigopts_Test_20 " , CL_VIRUS } , /* control */
{ " u \0 u \0 u \0 u \0 u \0 " , 10 , " 7575757575 " , " * " , ACPATT_OPTION_WIDE | ACPATT_OPTION_NOCASE | ACPATT_OPTION_FULLWORD , " AC_Sigopts_Test_21 " , CL_VIRUS } , /* control */
{ " v \0 v \0 v \0 v \0 v \0 " , 10 , " 7676767676 " , " * " , ACPATT_OPTION_WIDE | ACPATT_OPTION_NOCASE | ACPATT_OPTION_ASCII , " AC_Sigopts_Test_22 " , CL_VIRUS } , /* control */
{ " w \0 w \0 w \0 w \0 w \0 " , 10 , " 7777777777 " , " * " , ACPATT_OPTION_WIDE | ACPATT_OPTION_FULLWORD | ACPATT_OPTION_ASCII , " AC_Sigopts_Test_23 " , CL_VIRUS } , /* control */
{ " x \0 x \0 x \0 x \0 x \0 " , 10 , " 7878787878 " , " * " , ACPATT_OPTION_WIDE | ACPATT_OPTION_NOCASE | ACPATT_OPTION_FULLWORD | ACPATT_OPTION_ASCII , " AC_Sigopts_Test_24 " , CL_VIRUS } , /* control */
{ NULL , 0 , NULL , NULL , ACPATT_OPTION_NOOPTS , NULL , CL_CLEAN }
} ;
2015-06-03 15:28:39 -04:00
# if HAVE_PCRE
static const struct pcre_testdata_s {
const char * data ;
const char * hexsig ;
const char * offset ;
2015-06-09 11:12:20 -04:00
const uint16_t sigopts ;
2015-06-03 15:28:39 -04:00
const char * virname ;
const uint8_t expected_result ;
} pcre_testdata [ ] = {
2015-06-09 11:12:20 -04:00
{ " clamav " , " /clamav/ " , " * " , ACPATT_OPTION_NOOPTS , " Test_1: simple string " , CL_VIRUS } ,
{ " cla:mav " , " /cla:mav/ " , " * " , ACPATT_OPTION_NOOPTS , " Test_2: embedded colon " , CL_VIRUS } ,
2015-06-05 11:28:50 -04:00
2015-06-09 11:12:20 -04:00
{ " notbasic " , " /basic/r " , " 0 " , ACPATT_OPTION_NOOPTS , " Test_3: rolling option " , CL_VIRUS } ,
{ " nottrue " , " /true/ " , " 0 " , ACPATT_OPTION_NOOPTS , " Test4: rolling(off) option " , CL_SUCCESS } ,
2015-06-05 11:28:50 -04:00
2015-06-09 11:12:20 -04:00
{ " not12345678truly " , " /12345678/e " , " 3,8 " , ACPATT_OPTION_NOOPTS , " Test_5: encompass option " , CL_VIRUS } ,
{ " not23456789truly " , " /23456789/e " , " 4,8 " , ACPATT_OPTION_NOOPTS , " Test6: encompass option (low end) " , CL_SUCCESS } ,
{ " not34567890truly " , " /34567890/e " , " 3,7 " , ACPATT_OPTION_NOOPTS , " Test7: encompass option (high end) " , CL_SUCCESS } ,
2015-06-05 11:28:50 -04:00
2015-06-09 11:12:20 -04:00
{ " notapietruly " , " /apie/re " , " 2,2 " , ACPATT_OPTION_NOOPTS , " Test8: rolling encompass " , CL_SUCCESS } ,
{ " notafigtruly " , " /afig/e " , " 2,2 " , ACPATT_OPTION_NOOPTS , " Test9: rolling(off) encompass " , CL_SUCCESS } ,
{ " notatretruly " , " /atre/re " , " 2,6 " , ACPATT_OPTION_NOOPTS , " Test10: rolling encompass " , CL_VIRUS } ,
{ " notasadtruly " , " /asad/e " , " 2,6 " , ACPATT_OPTION_NOOPTS , " Test11: rolling(off) encompass " , CL_VIRUS } ,
2015-06-05 11:28:50 -04:00
2015-06-09 11:12:20 -04:00
{ NULL , NULL , NULL , ACPATT_OPTION_NOOPTS , NULL , CL_CLEAN }
2015-06-03 15:28:39 -04:00
} ;
# endif /* HAVE_PCRE */
2010-02-09 12:01:31 +02:00
static cli_ctx ctx ;
2010-02-22 17:59:32 +02:00
static fmap_t * thefmap = NULL ;
2010-02-09 12:01:31 +02:00
static const char * virname = NULL ;
static void setup ( void )
{
2008-08-07 12:40:41 +00:00
struct cli_matcher * root ;
2010-02-09 12:01:31 +02:00
virname = NULL ;
2010-02-22 17:59:32 +02:00
thefmap = NULL ;
2010-02-09 12:01:31 +02:00
ctx . virname = & virname ;
2010-02-22 17:59:32 +02:00
ctx . fmap = & thefmap ;
2010-02-09 12:01:31 +02:00
ctx . engine = cl_engine_new ( ) ;
fail_unless ( ! ! ctx . engine , " cl_engine_new() failed " ) ;
root = ( struct cli_matcher * ) mpool_calloc ( ctx . engine - > mempool , 1 , sizeof ( struct cli_matcher ) ) ;
fail_unless ( root ! = NULL , " root == NULL " ) ;
# ifdef USE_MPOOL
root - > mempool = ctx . engine - > mempool ;
# endif
ctx . engine - > root [ 0 ] = root ;
}
static void teardown ( void )
{
cl_engine_free ( ( struct cl_engine * ) ctx . engine ) ;
}
START_TEST ( test_ac_scanbuff ) {
2008-08-07 12:40:41 +00:00
struct cli_ac_data mdata ;
2010-02-09 12:01:31 +02:00
struct cli_matcher * root ;
2008-08-07 12:40:41 +00:00
unsigned int i ;
int ret ;
2010-02-09 12:01:31 +02:00
root = ctx . engine - > root [ 0 ] ;
2008-08-07 12:40:41 +00:00
fail_unless ( root ! = NULL , " root == NULL " ) ;
root - > ac_only = 1 ;
2008-11-04 10:40:24 +00:00
# ifdef USE_MPOOL
2009-01-26 19:47:02 +00:00
root - > mempool = mpool_create ( ) ;
2008-11-03 19:26:57 +00:00
# endif
2015-02-09 14:22:45 -08:00
ret = cli_ac_init ( root , CLI_DEFAULT_AC_MINDEPTH , CLI_DEFAULT_AC_MAXDEPTH , 1 ) ;
2008-08-07 12:40:41 +00:00
fail_unless ( ret = = CL_SUCCESS , " cli_ac_init() failed " ) ;
2010-02-09 12:01:31 +02:00
2008-08-07 12:40:41 +00:00
for ( i = 0 ; ac_testdata [ i ] . data ; i + + ) {
2015-02-20 18:13:28 -05:00
ret = cli_parse_add ( root , ac_testdata [ i ] . virname , ac_testdata [ i ] . hexsig , 0 , 0 , 0 , " * " , 0 , NULL , 0 ) ;
2008-08-07 12:40:41 +00:00
fail_unless ( ret = = CL_SUCCESS , " cli_parse_add() failed " ) ;
}
ret = cli_ac_buildtrie ( root ) ;
fail_unless ( ret = = CL_SUCCESS , " cli_ac_buildtrie() failed " ) ;
2009-08-21 15:55:10 +02:00
ret = cli_ac_initdata ( & mdata , root - > ac_partsigs , 0 , 0 , CLI_DEFAULT_AC_TRACKLEN ) ;
2008-08-07 12:40:41 +00:00
fail_unless ( ret = = CL_SUCCESS , " cli_ac_initdata() failed " ) ;
for ( i = 0 ; ac_testdata [ i ] . data ; i + + ) {
2010-04-13 16:19:47 +03:00
ret = cli_ac_scanbuff ( ( const unsigned char * ) ac_testdata [ i ] . data , strlen ( ac_testdata [ i ] . data ) , & virname , NULL , NULL , root , & mdata , 0 , 0 , NULL , AC_SCAN_VIR , NULL ) ;
2008-10-22 17:27:44 +00:00
fail_unless_fmt ( ret = = CL_VIRUS , " cli_ac_scanbuff() failed for %s " , ac_testdata [ i ] . virname ) ;
fail_unless_fmt ( ! strncmp ( virname , ac_testdata [ i ] . virname , strlen ( ac_testdata [ i ] . virname ) ) , " Dataset %u matched with %s " , i , virname ) ;
2010-02-09 12:01:31 +02:00
2010-04-13 16:19:47 +03:00
ret = cli_scanbuff ( ( const unsigned char * ) ac_testdata [ i ] . data , strlen ( ac_testdata [ i ] . data ) , 0 , & ctx , 0 , NULL ) ;
2010-02-09 12:01:31 +02:00
fail_unless_fmt ( ret = = CL_VIRUS , " cli_scanbuff() failed for %s " , ac_testdata [ i ] . virname ) ;
fail_unless_fmt ( ! strncmp ( virname , ac_testdata [ i ] . virname , strlen ( ac_testdata [ i ] . virname ) ) , " Dataset %u matched with %s " , i , virname ) ;
2008-08-07 12:40:41 +00:00
}
cli_ac_freedata ( & mdata ) ;
}
END_TEST
2012-10-18 14:12:58 -07:00
START_TEST ( test_ac_scanbuff_allscan ) {
struct cli_ac_data mdata ;
struct cli_matcher * root ;
unsigned int i ;
int ret ;
root = ctx . engine - > root [ 0 ] ;
fail_unless ( root ! = NULL , " root == NULL " ) ;
root - > ac_only = 1 ;
# ifdef USE_MPOOL
root - > mempool = mpool_create ( ) ;
# endif
2015-02-09 14:22:45 -08:00
ret = cli_ac_init ( root , CLI_DEFAULT_AC_MINDEPTH , CLI_DEFAULT_AC_MAXDEPTH , 1 ) ;
2012-10-18 14:12:58 -07:00
fail_unless ( ret = = CL_SUCCESS , " cli_ac_init() failed " ) ;
for ( i = 0 ; ac_testdata [ i ] . data ; i + + ) {
2015-02-20 18:13:28 -05:00
ret = cli_parse_add ( root , ac_testdata [ i ] . virname , ac_testdata [ i ] . hexsig , 0 , 0 , 0 , " * " , 0 , NULL , 0 ) ;
2012-10-18 14:12:58 -07:00
fail_unless ( ret = = CL_SUCCESS , " cli_parse_add() failed " ) ;
}
ret = cli_ac_buildtrie ( root ) ;
fail_unless ( ret = = CL_SUCCESS , " cli_ac_buildtrie() failed " ) ;
ret = cli_ac_initdata ( & mdata , root - > ac_partsigs , 0 , 0 , CLI_DEFAULT_AC_TRACKLEN ) ;
fail_unless ( ret = = CL_SUCCESS , " cli_ac_initdata() failed " ) ;
ctx . options | = CL_SCAN_ALLMATCHES ;
for ( i = 0 ; ac_testdata [ i ] . data ; i + + ) {
ret = cli_ac_scanbuff ( ( const unsigned char * ) ac_testdata [ i ] . data , strlen ( ac_testdata [ i ] . data ) , & virname , NULL , NULL , root , & mdata , 0 , 0 , NULL , AC_SCAN_VIR , NULL ) ;
fail_unless_fmt ( ret = = CL_VIRUS , " cli_ac_scanbuff() failed for %s " , ac_testdata [ i ] . virname ) ;
fail_unless_fmt ( ! strncmp ( virname , ac_testdata [ i ] . virname , strlen ( ac_testdata [ i ] . virname ) ) , " Dataset %u matched with %s " , i , virname ) ;
ret = cli_scanbuff ( ( const unsigned char * ) ac_testdata [ i ] . data , strlen ( ac_testdata [ i ] . data ) , 0 , & ctx , 0 , NULL ) ;
fail_unless_fmt ( ret = = CL_VIRUS , " cli_scanbuff() failed for %s " , ac_testdata [ i ] . virname ) ;
fail_unless_fmt ( ! strncmp ( virname , ac_testdata [ i ] . virname , strlen ( ac_testdata [ i ] . virname ) ) , " Dataset %u matched with %s " , i , virname ) ;
2015-10-01 17:47:37 -04:00
if ( ctx . num_viruses )
2012-10-18 14:12:58 -07:00
ctx . num_viruses = 0 ;
}
cli_ac_freedata ( & mdata ) ;
}
END_TEST
2015-06-09 11:12:20 -04:00
START_TEST ( test_ac_scanbuff_ex ) {
struct cli_ac_data mdata ;
struct cli_matcher * root ;
unsigned int i ;
int ret ;
root = ctx . engine - > root [ 0 ] ;
fail_unless ( root ! = NULL , " root == NULL " ) ;
root - > ac_only = 1 ;
# ifdef USE_MPOOL
root - > mempool = mpool_create ( ) ;
# endif
ret = cli_ac_init ( root , CLI_DEFAULT_AC_MINDEPTH , CLI_DEFAULT_AC_MAXDEPTH , 1 ) ;
fail_unless ( ret = = CL_SUCCESS , " [ac_ex] cli_ac_init() failed " ) ;
for ( i = 0 ; ac_sigopts_testdata [ i ] . data ; i + + ) {
ret = cli_sigopts_handler ( root , ac_sigopts_testdata [ i ] . virname , ac_sigopts_testdata [ i ] . hexsig , ac_sigopts_testdata [ i ] . sigopts , 0 , 0 , ac_sigopts_testdata [ i ] . offset , 0 , NULL , 0 ) ;
fail_unless ( ret = = CL_SUCCESS , " [ac_ex] cli_sigopts_handler() failed " ) ;
}
ret = cli_ac_buildtrie ( root ) ;
fail_unless ( ret = = CL_SUCCESS , " [ac_ex] cli_ac_buildtrie() failed " ) ;
ret = cli_ac_initdata ( & mdata , root - > ac_partsigs , 0 , 0 , CLI_DEFAULT_AC_TRACKLEN ) ;
fail_unless ( ret = = CL_SUCCESS , " [ac_ex] cli_ac_initdata() failed " ) ;
for ( i = 0 ; ac_sigopts_testdata [ i ] . data ; i + + ) {
ret = cli_ac_scanbuff ( ( const unsigned char * ) ac_sigopts_testdata [ i ] . data , ac_sigopts_testdata [ i ] . dlength , & virname , NULL , NULL , root , & mdata , 0 , 0 , NULL , AC_SCAN_VIR , NULL ) ;
fail_unless_fmt ( ret = = ac_sigopts_testdata [ i ] . expected_result , " [ac_ex] cli_ac_scanbuff() failed for %s (%d != %d) " , ac_sigopts_testdata [ i ] . virname , ret , ac_sigopts_testdata [ i ] . expected_result ) ;
if ( ac_sigopts_testdata [ i ] . expected_result = = CL_VIRUS )
fail_unless_fmt ( ! strncmp ( virname , ac_sigopts_testdata [ i ] . virname , strlen ( ac_sigopts_testdata [ i ] . virname ) ) , " [ac_ex] Dataset %u matched with %s " , i , virname ) ;
ret = cli_scanbuff ( ( const unsigned char * ) ac_sigopts_testdata [ i ] . data , ac_sigopts_testdata [ i ] . dlength , 0 , & ctx , 0 , NULL ) ;
fail_unless_fmt ( ret = = ac_sigopts_testdata [ i ] . expected_result , " [ac_ex] cli_ac_scanbuff() failed for %s (%d != %d) " , ac_sigopts_testdata [ i ] . virname , ret , ac_sigopts_testdata [ i ] . expected_result ) ;
}
cli_ac_freedata ( & mdata ) ;
}
END_TEST
START_TEST ( test_ac_scanbuff_allscan_ex ) {
struct cli_ac_data mdata ;
struct cli_matcher * root ;
unsigned int i ;
int ret ;
root = ctx . engine - > root [ 0 ] ;
fail_unless ( root ! = NULL , " root == NULL " ) ;
root - > ac_only = 1 ;
# ifdef USE_MPOOL
root - > mempool = mpool_create ( ) ;
# endif
ret = cli_ac_init ( root , CLI_DEFAULT_AC_MINDEPTH , CLI_DEFAULT_AC_MAXDEPTH , 1 ) ;
fail_unless ( ret = = CL_SUCCESS , " [ac_ex] cli_ac_init() failed " ) ;
for ( i = 0 ; ac_sigopts_testdata [ i ] . data ; i + + ) {
ret = cli_sigopts_handler ( root , ac_sigopts_testdata [ i ] . virname , ac_sigopts_testdata [ i ] . hexsig , ac_sigopts_testdata [ i ] . sigopts , 0 , 0 , ac_sigopts_testdata [ i ] . offset , 0 , NULL , 0 ) ;
fail_unless ( ret = = CL_SUCCESS , " [ac_ex] cli_sigopts_handler() failed " ) ;
}
ret = cli_ac_buildtrie ( root ) ;
fail_unless ( ret = = CL_SUCCESS , " [ac_ex] cli_ac_buildtrie() failed " ) ;
ret = cli_ac_initdata ( & mdata , root - > ac_partsigs , 0 , 0 , CLI_DEFAULT_AC_TRACKLEN ) ;
fail_unless ( ret = = CL_SUCCESS , " [ac_ex] cli_ac_initdata() failed " ) ;
ctx . options | = CL_SCAN_ALLMATCHES ;
for ( i = 0 ; ac_sigopts_testdata [ i ] . data ; i + + ) {
ret = cli_ac_scanbuff ( ( const unsigned char * ) ac_sigopts_testdata [ i ] . data , ac_sigopts_testdata [ i ] . dlength , & virname , NULL , NULL , root , & mdata , 0 , 0 , NULL , AC_SCAN_VIR , NULL ) ;
fail_unless_fmt ( ret = = ac_sigopts_testdata [ i ] . expected_result , " [ac_ex] cli_ac_scanbuff() failed for %s (%d != %d) " , ac_sigopts_testdata [ i ] . virname , ret , ac_sigopts_testdata [ i ] . expected_result ) ;
if ( ac_sigopts_testdata [ i ] . expected_result = = CL_VIRUS )
fail_unless_fmt ( ! strncmp ( virname , ac_sigopts_testdata [ i ] . virname , strlen ( ac_sigopts_testdata [ i ] . virname ) ) , " [ac_ex] Dataset %u matched with %s " , i , virname ) ;
ret = cli_scanbuff ( ( const unsigned char * ) ac_sigopts_testdata [ i ] . data , ac_sigopts_testdata [ i ] . dlength , 0 , & ctx , 0 , NULL ) ;
fail_unless_fmt ( ret = = ac_sigopts_testdata [ i ] . expected_result , " [ac_ex] cli_ac_scanbuff() failed for %s (%d != %d) " , ac_sigopts_testdata [ i ] . virname , ret , ac_sigopts_testdata [ i ] . expected_result ) ;
2015-10-01 17:47:37 -04:00
if ( ctx . num_viruses )
2015-06-09 11:12:20 -04:00
ctx . num_viruses = 0 ;
}
cli_ac_freedata ( & mdata ) ;
}
END_TEST
START_TEST ( test_bm_scanbuff ) {
struct cli_matcher * root ;
const char * virname = NULL ;
int ret ;
root = ctx . engine - > root [ 0 ] ;
fail_unless ( root ! = NULL , " root == NULL " ) ;
# ifdef USE_MPOOL
root - > mempool = mpool_create ( ) ;
# endif
ret = cli_bm_init ( root ) ;
fail_unless ( ret = = CL_SUCCESS , " cli_bm_init() failed " ) ;
ret = cli_parse_add ( root , " Sig1 " , " deadbabe " , 0 , 0 , 0 , " * " , 0 , NULL , 0 ) ;
fail_unless ( ret = = CL_SUCCESS , " cli_parse_add() failed " ) ;
ret = cli_parse_add ( root , " Sig2 " , " deadbeef " , 0 , 0 , 0 , " * " , 0 , NULL , 0 ) ;
fail_unless ( ret = = CL_SUCCESS , " cli_parse_add() failed " ) ;
ret = cli_parse_add ( root , " Sig3 " , " babedead " , 0 , 0 , 0 , " * " , 0 , NULL , 0 ) ;
fail_unless ( ret = = CL_SUCCESS , " cli_parse_add() failed " ) ;
ret = cli_bm_scanbuff ( ( const unsigned char * ) " blah \xde \xad \xbe \xef " , 12 , & virname , NULL , root , 0 , NULL , NULL , NULL ) ;
fail_unless ( ret = = CL_VIRUS , " cli_bm_scanbuff() failed " ) ;
fail_unless ( ! strncmp ( virname , " Sig2 " , 4 ) , " Incorrect signature matched in cli_bm_scanbuff() \n " ) ;
}
END_TEST
2012-10-18 14:12:58 -07:00
START_TEST ( test_bm_scanbuff_allscan ) {
struct cli_matcher * root ;
const char * virname = NULL ;
int ret ;
root = ctx . engine - > root [ 0 ] ;
fail_unless ( root ! = NULL , " root == NULL " ) ;
# ifdef USE_MPOOL
root - > mempool = mpool_create ( ) ;
# endif
ret = cli_bm_init ( root ) ;
fail_unless ( ret = = CL_SUCCESS , " cli_bm_init() failed " ) ;
2015-02-20 18:13:28 -05:00
ret = cli_parse_add ( root , " Sig1 " , " deadbabe " , 0 , 0 , 0 , " * " , 0 , NULL , 0 ) ;
2012-10-18 14:12:58 -07:00
fail_unless ( ret = = CL_SUCCESS , " cli_parse_add() failed " ) ;
2015-02-20 18:13:28 -05:00
ret = cli_parse_add ( root , " Sig2 " , " deadbeef " , 0 , 0 , 0 , " * " , 0 , NULL , 0 ) ;
2012-10-18 14:12:58 -07:00
fail_unless ( ret = = CL_SUCCESS , " cli_parse_add() failed " ) ;
2015-02-20 18:13:28 -05:00
ret = cli_parse_add ( root , " Sig3 " , " babedead " , 0 , 0 , 0 , " * " , 0 , NULL , 0 ) ;
2012-10-18 14:12:58 -07:00
fail_unless ( ret = = CL_SUCCESS , " cli_parse_add() failed " ) ;
ret = cli_bm_scanbuff ( ( const unsigned char * ) " blah \xde \xad \xbe \xef " , 12 , & virname , NULL , root , 0 , NULL , NULL , NULL ) ;
2008-08-07 12:40:41 +00:00
fail_unless ( ret = = CL_VIRUS , " cli_bm_scanbuff() failed " ) ;
fail_unless ( ! strncmp ( virname , " Sig2 " , 4 ) , " Incorrect signature matched in cli_bm_scanbuff() \n " ) ;
}
END_TEST
2015-06-03 15:28:39 -04:00
# if HAVE_PCRE
START_TEST ( test_pcre_scanbuff ) {
struct cli_ac_data mdata ;
struct cli_matcher * root ;
char * hexsig ;
unsigned int i , hexlen ;
int ret ;
root = ctx . engine - > root [ 0 ] ;
fail_unless ( root ! = NULL , " root == NULL " ) ;
# ifdef USE_MPOOL
root - > mempool = mpool_create ( ) ;
# endif
ret = cli_pcre_init ( ) ;
fail_unless ( ret = = CL_SUCCESS , " [pcre] cli_pcre_init() failed " ) ;
for ( i = 0 ; pcre_testdata [ i ] . data ; i + + ) {
hexlen = strlen ( PCRE_BYPASS ) + strlen ( pcre_testdata [ i ] . hexsig ) + 1 ;
hexsig = cli_calloc ( hexlen , sizeof ( char ) ) ;
fail_unless ( hexsig ! = NULL , " [pcre] failed to prepend bypass (out-of-memory) " ) ;
strncat ( hexsig , PCRE_BYPASS , hexlen ) ;
strncat ( hexsig , pcre_testdata [ i ] . hexsig , hexlen ) ;
2015-06-09 11:12:20 -04:00
ret = cli_parse_add ( root , pcre_testdata [ i ] . virname , hexsig , pcre_testdata [ i ] . sigopts , 0 , 0 , pcre_testdata [ i ] . offset , 0 , NULL , 0 ) ;
2015-06-03 15:28:39 -04:00
fail_unless ( ret = = CL_SUCCESS , " [pcre] cli_parse_add() failed " ) ;
free ( hexsig ) ;
}
ret = cli_pcre_build ( root , CLI_DEFAULT_PCRE_MATCH_LIMIT , CLI_DEFAULT_PCRE_RECMATCH_LIMIT , NULL ) ;
fail_unless ( ret = = CL_SUCCESS , " [pcre] cli_pcre_build() failed " ) ;
// recomputate offsets
ret = cli_ac_initdata ( & mdata , root - > ac_partsigs , root - > ac_lsigs , root - > ac_reloff_num , CLI_DEFAULT_AC_TRACKLEN ) ;
fail_unless ( ret = = CL_SUCCESS , " [pcre] cli_ac_initdata() failed " ) ;
for ( i = 0 ; pcre_testdata [ i ] . data ; i + + ) {
ret = cli_pcre_scanbuf ( ( const unsigned char * ) pcre_testdata [ i ] . data , strlen ( pcre_testdata [ i ] . data ) , & virname , NULL , root , NULL , NULL , NULL ) ;
fail_unless_fmt ( ret = = pcre_testdata [ i ] . expected_result , " [pcre] cli_pcre_scanbuff() failed for %s (%d != %d) " , pcre_testdata [ i ] . virname , ret , pcre_testdata [ i ] . expected_result ) ;
if ( pcre_testdata [ i ] . expected_result = = CL_VIRUS )
fail_unless_fmt ( ! strncmp ( virname , pcre_testdata [ i ] . virname , strlen ( pcre_testdata [ i ] . virname ) ) , " [pcre] Dataset %u matched with %s " , i , virname ) ;
ret = cli_scanbuff ( ( const unsigned char * ) pcre_testdata [ i ] . data , strlen ( pcre_testdata [ i ] . data ) , 0 , & ctx , 0 , NULL ) ;
fail_unless_fmt ( ret = = pcre_testdata [ i ] . expected_result , " [pcre] cli_scanbuff() failed for %s " , pcre_testdata [ i ] . virname ) ;
}
cli_ac_freedata ( & mdata ) ;
}
END_TEST
START_TEST ( test_pcre_scanbuff_allscan ) {
struct cli_ac_data mdata ;
struct cli_matcher * root ;
char * hexsig ;
unsigned int i , hexlen ;
int ret ;
root = ctx . engine - > root [ 0 ] ;
fail_unless ( root ! = NULL , " root == NULL " ) ;
# ifdef USE_MPOOL
root - > mempool = mpool_create ( ) ;
# endif
ret = cli_pcre_init ( ) ;
fail_unless ( ret = = CL_SUCCESS , " [pcre] cli_pcre_init() failed " ) ;
for ( i = 0 ; pcre_testdata [ i ] . data ; i + + ) {
hexlen = strlen ( PCRE_BYPASS ) + strlen ( pcre_testdata [ i ] . hexsig ) + 1 ;
hexsig = cli_calloc ( hexlen , sizeof ( char ) ) ;
fail_unless ( hexsig ! = NULL , " [pcre] failed to prepend bypass (out-of-memory) " ) ;
strncat ( hexsig , PCRE_BYPASS , hexlen ) ;
strncat ( hexsig , pcre_testdata [ i ] . hexsig , hexlen ) ;
ret = cli_parse_add ( root , pcre_testdata [ i ] . virname , hexsig , 0 , 0 , 0 , pcre_testdata [ i ] . offset , 0 , NULL , 0 ) ;
fail_unless ( ret = = CL_SUCCESS , " [pcre] cli_parse_add() failed " ) ;
free ( hexsig ) ;
}
ret = cli_pcre_build ( root , CLI_DEFAULT_PCRE_MATCH_LIMIT , CLI_DEFAULT_PCRE_RECMATCH_LIMIT , NULL ) ;
fail_unless ( ret = = CL_SUCCESS , " [pcre] cli_pcre_build() failed " ) ;
// recomputate offsets
ret = cli_ac_initdata ( & mdata , root - > ac_partsigs , root - > ac_lsigs , root - > ac_reloff_num , CLI_DEFAULT_AC_TRACKLEN ) ;
fail_unless ( ret = = CL_SUCCESS , " [pcre] cli_ac_initdata() failed " ) ;
ctx . options | = CL_SCAN_ALLMATCHES ;
for ( i = 0 ; pcre_testdata [ i ] . data ; i + + ) {
ret = cli_pcre_scanbuf ( ( const unsigned char * ) pcre_testdata [ i ] . data , strlen ( pcre_testdata [ i ] . data ) , & virname , NULL , root , NULL , NULL , NULL ) ;
fail_unless_fmt ( ret = = pcre_testdata [ i ] . expected_result , " [pcre] cli_pcre_scanbuff() failed for %s (%d != %d) " , pcre_testdata [ i ] . virname , ret , pcre_testdata [ i ] . expected_result ) ;
if ( pcre_testdata [ i ] . expected_result = = CL_VIRUS )
fail_unless_fmt ( ! strncmp ( virname , pcre_testdata [ i ] . virname , strlen ( pcre_testdata [ i ] . virname ) ) , " [pcre] Dataset %u matched with %s " , i , virname ) ;
ret = cli_scanbuff ( ( const unsigned char * ) pcre_testdata [ i ] . data , strlen ( pcre_testdata [ i ] . data ) , 0 , & ctx , 0 , NULL ) ;
fail_unless_fmt ( ret = = pcre_testdata [ i ] . expected_result , " [pcre] cli_scanbuff() failed for %s " , pcre_testdata [ i ] . virname ) ;
/* num_virus field add to test case struct */
2015-10-01 17:47:37 -04:00
if ( ctx . num_viruses )
2015-06-03 15:28:39 -04:00
ctx . num_viruses = 0 ;
}
cli_ac_freedata ( & mdata ) ;
}
END_TEST
# endif /* HAVE_PCRE */
2008-08-07 12:40:41 +00:00
Suite * test_matchers_suite ( void )
{
Suite * s = suite_create ( " matchers " ) ;
TCase * tc_matchers ;
tc_matchers = tcase_create ( " matchers " ) ;
suite_add_tcase ( s , tc_matchers ) ;
2010-02-09 12:01:31 +02:00
tcase_add_checked_fixture ( tc_matchers , setup , teardown ) ;
2008-08-07 12:40:41 +00:00
tcase_add_test ( tc_matchers , test_ac_scanbuff ) ;
2015-06-09 11:12:20 -04:00
tcase_add_test ( tc_matchers , test_ac_scanbuff_ex ) ;
2008-08-07 12:40:41 +00:00
tcase_add_test ( tc_matchers , test_bm_scanbuff ) ;
2015-06-03 15:28:39 -04:00
# if HAVE_PCRE
tcase_add_test ( tc_matchers , test_pcre_scanbuff ) ;
# endif
2012-10-18 14:12:58 -07:00
tcase_add_test ( tc_matchers , test_ac_scanbuff_allscan ) ;
2015-06-09 11:12:20 -04:00
tcase_add_test ( tc_matchers , test_ac_scanbuff_allscan_ex ) ;
2012-10-18 14:12:58 -07:00
tcase_add_test ( tc_matchers , test_bm_scanbuff_allscan ) ;
2015-06-03 15:28:39 -04:00
# if HAVE_PCRE
tcase_add_test ( tc_matchers , test_pcre_scanbuff_allscan ) ;
# endif
2008-08-07 12:40:41 +00:00
return s ;
}