@@ -921,12 +921,29 @@ static rktest_config_t parse_args(int argc, const char* argv[]) {
921
921
else if (string_starts_with (arg , "--rktest_filter=" )) {
922
922
const char * filter_pattern = arg + strlen ("--rktest_filter=" );
923
923
const size_t filter_len = strlen (filter_pattern );
924
- if (filter_len > RKTEST_MAX_FILTER_LENGTH ) {
925
- fprintf (stderr , "Error: filter pattern too long. Max length is (%d)" , RKTEST_MAX_FILTER_LENGTH );
924
+ const size_t max_filter_len = RKTEST_MAX_FILTER_LENGTH - 1 ;
925
+ if (filter_len > max_filter_len ) {
926
+ fprintf (stderr , "Error: filter pattern too long. Max length is (%lu)" , max_filter_len );
926
927
fprintf (stderr , "filter pattern = \"%s\"" , filter_pattern );
927
928
exit (1 );
928
929
}
929
- strncpy (config .test_filter , filter_pattern , filter_len );
930
+ // strncpy will copy all bytes up to a NULL in the source or until it
931
+ // reaches the size in the third param.
932
+ //
933
+ // This means if the source string is equal to or greater than the length,
934
+ // it will not add a NULL to the end of the destination.
935
+ //
936
+ // Examples from the strncpy man page are useful,
937
+ //
938
+ // strncpy(buf, "1", 5); // { '1', 0, 0, 0, 0 }
939
+ // strncpy(buf, "1234", 5); // { '1', '2', '3', '4', 0 }
940
+ // strncpy(buf, "12345", 5); // { '1', '2', '3', '4', '5' }
941
+ // strncpy(buf, "123456", 5); // { '1', '2', '3', '4', '5' }
942
+ //
943
+ // So if test_filter is a char[256], then max_filter_len will be 255 and if
944
+ // filter_pattern is also 255, then it will have one character left which
945
+ // strncpy will make a NULL.
946
+ strncpy (config .test_filter , filter_pattern , max_filter_len );
930
947
}
931
948
932
949
else if (string_starts_with (arg , "--rktest_print_time=" )) {
0 commit comments