diff -up vsftpd-2.0.5/ls.c.greedy vsftpd-2.0.5/ls.c --- vsftpd-2.0.5/ls.c.greedy 2007-12-03 12:03:50.000000000 +0100 +++ vsftpd-2.0.5/ls.c 2007-12-03 12:12:05.000000000 +0100 @@ -303,6 +303,25 @@ vsf_filename_passes_filter(const struct { goto out; } + if (!must_match_at_current_pos) + { + struct mystr scan_fwd = INIT_MYSTR; + + str_mid_to_end(&name_remain_str, &scan_fwd, + indexx + str_getlen(&s_match_needed_str)); + /* We're allowed to be greedy, test if it match further along + * keep advancing indexx while we can still match. + */ + while( (locate_result = str_locate_str(&scan_fwd, &s_match_needed_str)), + locate_result.found ) + { + indexx += locate_result.index + str_getlen(&s_match_needed_str); + str_mid_to_end(&scan_fwd, &temp_str, + locate_result.index + str_getlen(&s_match_needed_str)); + str_copy(&scan_fwd, &temp_str); + } + str_free(&scan_fwd); + } /* Chop matched string out of remainder */ str_mid_to_end(&name_remain_str, &temp_str, indexx + str_getlen(&s_match_needed_str));