Re: [RFC PATCH] libselinux: disable capturing in fcontext matching

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jan 8, 2024 at 7:00 AM Christian Göttsche
<cgzones@xxxxxxxxxxxxxx> wrote:
>
> The path of a file context definition is compared as a regular
> expression against actual pathnames.  Those definitions make frequently
> use of groups, like `(/.*)?`, which are capturing by default, causing
> the regex engine to extract and save the matched input.  Matching
> context definitions against pathnames only cares about whether it's a
> match or not, potential captures are never accessed.
>
> Compile regular expressions (in the default PCRE2 variant) with the flag
> PCRE2_NO_AUTO_CAPTURE to turn captured groups automatically into non
> captured ones, like `(/.*)?` into `(?:/.*)?`.  This saves some cycles
> during lookup operations (~1.5%).
>
> Only potential regression would be the advanced usage of backreferences
> or recursion/subroutine calls to numbered captures, which would need an
> update to use named captures instead.
>

I don't think a ~1.5% improvement is going to be worth the potential
for regressions. I don't know of any policy that makes use of capture
groups, but there probably is someone somewhere who does.

That being said, if others are strongly for it, I can be persuaded.

Jim


> Signed-off-by: Christian Göttsche <cgzones@xxxxxxxxxxxxxx>
> ---
>  libselinux/src/regex.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/libselinux/src/regex.c b/libselinux/src/regex.c
> index 88d82fed..87423c48 100644
> --- a/libselinux/src/regex.c
> +++ b/libselinux/src/regex.c
> @@ -80,7 +80,7 @@ int regex_prepare_data(struct regex_data **regex, char const *pattern_string,
>                 return -1;
>
>         (*regex)->regex = pcre2_compile(
> -           (PCRE2_SPTR)pattern_string, PCRE2_ZERO_TERMINATED, PCRE2_DOTALL,
> +           (PCRE2_SPTR)pattern_string, PCRE2_ZERO_TERMINATED, PCRE2_DOTALL | PCRE2_NO_AUTO_CAPTURE,
>             &errordata->error_code, &errordata->error_offset, NULL);
>         if (!(*regex)->regex) {
>                 goto err;
> --
> 2.43.0
>
>





[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux