55#include "torture.h"
66#include "libssh/options.h"
77#include "libssh/session.h"
8+ #include "libssh/config_parser.h"
9+ #include "match.c"
810
911extern LIBSSH_THREAD int ssh_log_level ;
1012
@@ -907,6 +909,89 @@ static void torture_config_pubkeyacceptedkeytypes(void **state)
907909 }
908910}
909911
912+ /* match_pattern() sanity tests
913+ */
914+ static void torture_config_match_pattern (void * * state )
915+ {
916+ int rv = 0 ;
917+
918+ (void ) state ;
919+
920+ /* Simple test "a" matches "a" */
921+ rv = match_pattern ("a" , "a" , MAX_MATCH_RECURSION );
922+ assert_int_equal (rv , 1 );
923+
924+ /* Simple test "a" does not match "b" */
925+ rv = match_pattern ("a" , "b" , MAX_MATCH_RECURSION );
926+ assert_int_equal (rv , 0 );
927+
928+ /* NULL arguments are correctly handled */
929+ rv = match_pattern ("a" , NULL , MAX_MATCH_RECURSION );
930+ assert_int_equal (rv , 0 );
931+ rv = match_pattern (NULL , "a" , MAX_MATCH_RECURSION );
932+ assert_int_equal (rv , 0 );
933+
934+ /* Simple wildcard ? is handled in pattern */
935+ rv = match_pattern ("a" , "?" , MAX_MATCH_RECURSION );
936+ assert_int_equal (rv , 1 );
937+ rv = match_pattern ("aa" , "?" , MAX_MATCH_RECURSION );
938+ assert_int_equal (rv , 0 );
939+ rv = match_pattern ("?" , "a" , MAX_MATCH_RECURSION ); /* Wildcard in search string */
940+ assert_int_equal (rv , 0 );
941+ rv = match_pattern ("?" , "?" , MAX_MATCH_RECURSION );
942+ assert_int_equal (rv , 1 );
943+
944+ /* Simple wildcard * is handled in pattern */
945+ rv = match_pattern ("a" , "*" , MAX_MATCH_RECURSION );
946+ assert_int_equal (rv , 1 );
947+ rv = match_pattern ("aa" , "*" , MAX_MATCH_RECURSION );
948+ assert_int_equal (rv , 1 );
949+ rv = match_pattern ("*" , "a" , MAX_MATCH_RECURSION ); /* Wildcard in search string */
950+ assert_int_equal (rv , 0 );
951+ rv = match_pattern ("*" , "*" , MAX_MATCH_RECURSION );
952+ assert_int_equal (rv , 1 );
953+
954+ /* More complicated patterns */
955+ rv = match_pattern ("a" , "*a" , MAX_MATCH_RECURSION );
956+ assert_int_equal (rv , 1 );
957+ rv = match_pattern ("a" , "a*" , MAX_MATCH_RECURSION );
958+ assert_int_equal (rv , 1 );
959+ rv = match_pattern ("abababc" , "*abc" , MAX_MATCH_RECURSION );
960+ assert_int_equal (rv , 1 );
961+ rv = match_pattern ("ababababca" , "*abc" , MAX_MATCH_RECURSION );
962+ assert_int_equal (rv , 0 );
963+ rv = match_pattern ("ababababca" , "*abc*" , MAX_MATCH_RECURSION );
964+ assert_int_equal (rv , 1 );
965+
966+ /* Multiple wildcards in row */
967+ rv = match_pattern ("aa" , "??" , MAX_MATCH_RECURSION );
968+ assert_int_equal (rv , 1 );
969+ rv = match_pattern ("bba" , "??a" , MAX_MATCH_RECURSION );
970+ assert_int_equal (rv , 1 );
971+ rv = match_pattern ("aaa" , "**a" , MAX_MATCH_RECURSION );
972+ assert_int_equal (rv , 1 );
973+ rv = match_pattern ("bbb" , "**a" , MAX_MATCH_RECURSION );
974+ assert_int_equal (rv , 0 );
975+
976+ /* Consecutive asterisks do not make sense and do not need to recurse */
977+ rv = match_pattern ("hostname" , "**********pattern" , 5 );
978+ assert_int_equal (rv , 0 );
979+ rv = match_pattern ("hostname" , "pattern**********" , 5 );
980+ assert_int_equal (rv , 0 );
981+ rv = match_pattern ("pattern" , "***********pattern" , 5 );
982+ assert_int_equal (rv , 1 );
983+ rv = match_pattern ("pattern" , "pattern***********" , 5 );
984+ assert_int_equal (rv , 1 );
985+
986+ /* Limit the maximum recursion */
987+ rv = match_pattern ("hostname" , "*p*a*t*t*e*r*n*" , 5 );
988+ assert_int_equal (rv , 0 );
989+ rv = match_pattern ("pattern" , "*p*a*t*t*e*r*n*" , 5 ); /* Too much recursion */
990+ assert_int_equal (rv , 0 );
991+
992+ }
993+
994+
910995int torture_run_tests (void ) {
911996 int rc ;
912997 struct CMUnitTest tests [] = {
@@ -920,6 +1005,7 @@ int torture_run_tests(void) {
9201005 cmocka_unit_test (torture_config_proxyjump ),
9211006 cmocka_unit_test (torture_config_rekey ),
9221007 cmocka_unit_test (torture_config_pubkeyacceptedkeytypes ),
1008+ cmocka_unit_test (torture_config_match_pattern ),
9231009 };
9241010
9251011
0 commit comments