NAME path
PROG fentry:security_file_open { if (strcontains(path(args.file->f_path, 128), "tmp")) { printf("OK\n"); exit(); } }
EXPECT OK
REQUIRES_FEATURE dpath fentry
AFTER TMPDIR=/tmp ./testprogs/syscall open

NAME literals
PROG begin { if (strcontains("abc", "a")) { printf("OK\n");  } }
EXPECT OK
TIMEOUT 1

NAME no literals
# Clamping is done to not blow verifier complexity limits
PROG tracepoint:syscalls:sys_enter_execve / str(args.argv[0]) == "./testprogs/true" / { print(strcontains(str(args.argv[1], 32), str(args.argv[2], 32))); exit(); }
AFTER ./testprogs/true zztest test
EXPECT true
TIMEOUT 1

NAME string truncation does not affect matching
PROG tracepoint:syscalls:sys_enter_execve / str(args.argv[0]) == "./testprogs/true" / { print(strcontains(str(args.argv[1], 6), str(args.argv[2], 4))); exit(); }
AFTER ./testprogs/true zztest test
EXPECT true

NAME basic substring match
PROG begin { print(strcontains("hello-test-world", "test"));  }
EXPECT true
TIMEOUT 1

NAME substring at end
PROG begin { print(strcontains("hello-test-world", "world"));  }
EXPECT true
TIMEOUT 1

NAME substring at beginning
PROG begin { print(strcontains("hello-test-world", "hello"));  }
EXPECT true
TIMEOUT 1

NAME no match
PROG begin { print(strcontains("hello-test-world", "not-there"));  }
EXPECT false
TIMEOUT 1

NAME empty haystack, empty needle
PROG begin { print(strcontains("", ""));  }
EXPECT true
TIMEOUT 1

NAME non-empty haystack, empty needle
PROG begin { print(strcontains("hello", ""));  }
EXPECT true
TIMEOUT 1

NAME empty haystack, non-empty needle
PROG begin { print(strcontains("", "test"));  }
EXPECT false
TIMEOUT 1

NAME exact match
PROG begin { print(strcontains("hello", "hello"));  }
EXPECT true
TIMEOUT 1

NAME needle longer than haystack
PROG begin { print(strcontains("hello", "hello-longer"));  }
EXPECT false
TIMEOUT 1

NAME case sensitivity check
PROG begin { print(strcontains("Hello World", "hello"));  }
EXPECT false
TIMEOUT 1

NAME multiple occurrences
PROG begin { print(strcontains("test-test-test", "test"));  }
EXPECT true
TIMEOUT 1

NAME overlapping potential matches
PROG begin { print(strcontains("ababac", "abac"));  }
EXPECT true
TIMEOUT 1

NAME special characters
PROG begin { print(strcontains("hello\tworld", "\two"));  }
EXPECT true
TIMEOUT 1

NAME null terminator inside haystack
PROG begin { $str = "hello\0world"; print(strcontains($str, "world"));  }
EXPECT false
TIMEOUT 1

NAME content after null terminator
PROG begin { $str = "hello\0test"; print(strcontains($str, "test"));  }
EXPECT false
TIMEOUT 1

NAME null character in needle
PROG begin { $needle = "wo\0rld"; print(strcontains("hello world", $needle));  }
EXPECT true
TIMEOUT 1

NAME null character in both
PROG begin { $haystack = "hello\0world"; $needle = "wo\0rld"; print(strcontains($haystack, $needle));  }
EXPECT false
TIMEOUT 1
