From 0315f88541b05cd179690d10daf72ad2b98d1459 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sun, 8 Jan 2023 13:27:53 +0000 Subject: [PATCH] util: Move regex compilation function Signed-off-by: Michael Tremer --- src/libpakfire/include/pakfire/util.h | 8 ++++++ src/libpakfire/parser.c | 38 +++++---------------------- src/libpakfire/util.c | 32 ++++++++++++++++++++++ 3 files changed, 46 insertions(+), 32 deletions(-) diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index f713f6dc..162235ca 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -28,6 +28,9 @@ #include +#define PCRE2_CODE_UNIT_WIDTH 8 +#include + #include #include @@ -99,6 +102,11 @@ int pakfire_json_add_string_array(struct pakfire* pakfire, int pakfire_rlimit_set(struct pakfire* pakfire, int limit); int pakfire_rlimit_reset_nofile(struct pakfire* pakfire); +// Regex + +int pakfire_compile_regex(struct pakfire* pakfire, pcre2_code** regex, + const char* pattern); + #endif #endif /* PAKFIRE_UTIL_H */ diff --git a/src/libpakfire/parser.c b/src/libpakfire/parser.c index 7a8da8d5..44308427 100644 --- a/src/libpakfire/parser.c +++ b/src/libpakfire/parser.c @@ -53,51 +53,25 @@ struct pakfire_parser { // Regular expressions pcre2_code* regex_command; pcre2_code* regex_variable; -}; - -static int pakfire_parser_compile_regex(struct pakfire_parser* parser, pcre2_code** regex, - const char* pattern) { - int pcre2_errno; - size_t pcre2_offset; - PCRE2_UCHAR errmsg[256]; - - // Compile the regular expression - *regex = pcre2_compile((PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED, 0, - &pcre2_errno, &pcre2_offset, NULL); - - if (!*regex) { - pcre2_get_error_message(pcre2_errno, errmsg, sizeof(errmsg)); - ERROR(parser->pakfire, "PCRE2 compilation failed for '%s' at offset %zu: %s\n", - pattern, pcre2_offset, errmsg); - return 1; - } - // Enable JIT - pcre2_errno = pcre2_jit_compile(*regex, PCRE2_JIT_COMPLETE); - if (pcre2_errno) { - pcre2_get_error_message(pcre2_errno, errmsg, sizeof(errmsg)); - ERROR(parser->pakfire, "Enabling JIT on '%s' failed: %s\n", pattern, errmsg); - return 1; - } - - return 0; -} + // XXX THESE ARE NEVER FREED +}; static int pakfire_parser_compile_regexes(struct pakfire_parser* parser) { int r; // Commands if (!parser->regex_command && (parser->flags & PAKFIRE_PARSER_FLAGS_EXPAND_COMMANDS)) { - r = pakfire_parser_compile_regex(parser, - &parser->regex_command, "%(\\(((?>[^()]|(?1))*)\\))"); + r = pakfire_compile_regex(parser->pakfire, &parser->regex_command, + "%(\\(((?>[^()]|(?1))*)\\))"); if (r) return r; } // Variables if (!parser->regex_variable) { - r = pakfire_parser_compile_regex(parser, - &parser->regex_variable, "%\\{([A-Za-z0-9_\\-]+)\\}"); + r = pakfire_compile_regex(parser->pakfire, &parser->regex_variable, + "%\\{([A-Za-z0-9_\\-]+)\\}"); if (r) return r; } diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index efb086fa..cc4fbdcc 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -38,6 +38,9 @@ #include #include +#define PCRE2_CODE_UNIT_WIDTH 8 +#include + #include #include #include @@ -742,3 +745,32 @@ int pakfire_rlimit_set(struct pakfire* pakfire, int limit) { int pakfire_rlimit_reset_nofile(struct pakfire* pakfire) { return pakfire_rlimit_set(pakfire, FD_SETSIZE); } + +// Regex + +int pakfire_compile_regex(struct pakfire* pakfire, pcre2_code** regex, const char* pattern) { + int pcre2_errno; + size_t pcre2_offset; + PCRE2_UCHAR errmsg[256]; + + // Compile the regular expression + *regex = pcre2_compile((PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED, 0, + &pcre2_errno, &pcre2_offset, NULL); + + if (!*regex) { + pcre2_get_error_message(pcre2_errno, errmsg, sizeof(errmsg)); + ERROR(pakfire, "PCRE2 compilation failed for '%s' at offset %zu: %s\n", + pattern, pcre2_offset, errmsg); + return 1; + } + + // Enable JIT + pcre2_errno = pcre2_jit_compile(*regex, PCRE2_JIT_COMPLETE); + if (pcre2_errno) { + pcre2_get_error_message(pcre2_errno, errmsg, sizeof(errmsg)); + ERROR(pakfire, "Enabling JIT on '%s' failed: %s\n", pattern, errmsg); + return 1; + } + + return 0; +} -- 2.47.3