On Fri, Dec 3, 2021 at 2:43 AM Petr Lautrbach <plautrba@xxxxxxxxxx> wrote: > > Christian Göttsche <cgzones@xxxxxxxxxxxxxx> writes: > > > Quoting pcre.org: > > > > There are two major versions of the PCRE library. The current > > version, PCRE2, released in 2015, is now at version 10.39. > > > > The older, but still widely deployed PCRE library, originally > > released in 1997, is at version 8.45. This version of PCRE is now at > > end of life, and is no longer being actively maintained. Version > > 8.45 is expected to be the final release of the older PCRE library, > > and new projects should use PCRE2 instead. > > > > Signed-off-by: Christian Göttsche <cgzones@xxxxxxxxxxxxxx> > > There's few minor whitespace issues, see inline. > > Other than that > > Acked-by: Petr Lautrbach <plautrba@xxxxxxxxxx> > I fixed the whitespace issues and merged this series. Thanks, Jim > Thanks! > > > > --- > > v2: > > - do not use pcre2_substring_get_bynumber(), fixes NATO mcstrans > > tests (spotted by Petr Lautrbach) > > --- > > mcstrans/Makefile | 6 ++ > > mcstrans/src/Makefile | 4 +- > > mcstrans/src/mcstrans.c | 131 ++++++++++++++++++++++++++++------------ > > mcstrans/utils/Makefile | 6 +- > > 4 files changed, 104 insertions(+), 43 deletions(-) > > > > diff --git a/mcstrans/Makefile b/mcstrans/Makefile > > index c993a9f5..b20279ab 100644 > > --- a/mcstrans/Makefile > > +++ b/mcstrans/Makefile > > @@ -1,3 +1,9 @@ > > +PKG_CONFIG ?= pkg-config > > +PCRE_MODULE := libpcre2-8 > > +PCRE_CFLAGS := $(shell $(PKG_CONFIG) --cflags $(PCRE_MODULE)) -DPCRE2_CODE_UNIT_WIDTH=8 > > +PCRE_LDLIBS := $(shell $(PKG_CONFIG) --libs $(PCRE_MODULE)) > > +export PCRE_MODULE PCRE_CFLAGS PCRE_LDLIBS > > + > > all: > > $(MAKE) -C src > > $(MAKE) -C utils > > diff --git a/mcstrans/src/Makefile b/mcstrans/src/Makefile > > index 76ef0557..ef518625 100644 > > --- a/mcstrans/src/Makefile > > +++ b/mcstrans/src/Makefile > > @@ -20,10 +20,10 @@ CFLAGS ?= -Wall -W -Wundef -Wmissing-noreturn -Wmissing-format-attribute > > all: $(PROG) > > > > $(PROG): $(PROG_OBJS) $(LIBSEPOLA) > > - $(CC) $(LDFLAGS) -pie -o $@ $^ -lselinux -lcap -lpcre $(LDLIBS_LIBSEPOLA) > > + $(CC) $(LDFLAGS) -pie -o $@ $^ -lselinux -lcap $(PCRE_LDLIBS) $(LDLIBS_LIBSEPOLA) > > > > %.o: %.c > > - $(CC) $(CFLAGS) -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -fPIE -c -o $@ $< > > + $(CC) $(CFLAGS) $(PCRE_CFLAGS) -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -fPIE -c -o $@ $< > > > > install: all > > test -d $(DESTDIR)$(SBINDIR) || install -m 755 -d $(DESTDIR)$(SBINDIR) > > diff --git a/mcstrans/src/mcstrans.c b/mcstrans/src/mcstrans.c > > index 09577ea0..6e4bfd3b 100644 > > --- a/mcstrans/src/mcstrans.c > > +++ b/mcstrans/src/mcstrans.c > > @@ -26,7 +26,7 @@ > > #include <selinux/context.h> > > #include <syslog.h> > > #include <errno.h> > > -#include <pcre.h> > > +#include <pcre2.h> > > #include <ctype.h> > > #include <time.h> > > #include <sys/time.h> > > @@ -36,7 +36,6 @@ > > #include "mcstrans.h" > > > > #define N_BUCKETS 1453 > > -#define OVECCOUNT (512*3) > > > > #define log_error(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__) > > > > @@ -82,9 +81,9 @@ typedef struct word_group { > > affix_t *suffixes; > > word_t *words; > > > > - pcre *prefix_regexp; > > - pcre *word_regexp; > > - pcre *suffix_regexp; > > + pcre2_code *prefix_regexp; > > + pcre2_code *word_regexp; > > + pcre2_code *suffix_regexp; > > > > ebitmap_t def; > > > > @@ -109,7 +108,7 @@ typedef struct domain { > > base_classification_t *base_classifications; > > word_group_t *groups; > > > > - pcre *base_classification_regexp; > > + pcre2_code *base_classification_regexp; > > struct domain *next; > > } domain_t; > > > > @@ -317,9 +316,9 @@ destroy_group(word_group_t **list, word_group_t *group) { > > free(group->name); > > free(group->sword); > > free(group->join); > > - pcre_free(group->prefix_regexp); > > - pcre_free(group->word_regexp); > > - pcre_free(group->suffix_regexp); > > + pcre2_code_free(group->prefix_regexp); > > + pcre2_code_free(group->word_regexp); > > + pcre2_code_free(group->suffix_regexp); > > ebitmap_destroy(&group->def); > > free(group); > > } > > @@ -392,7 +391,7 @@ destroy_domain(domain_t *domain) { > > free(domain->base_classifications); > > domain->base_classifications = next; > > } > > - pcre_free(domain->base_classification_regexp); > > + pcre2_code_free(domain->base_classification_regexp); > > while (domain->groups) > > destroy_group(&domain->groups, domain->groups); > > free(domain->name); > > @@ -963,14 +962,16 @@ word_size(const void *p1, const void *p2) { > > } > > > > static void > > -build_regexp(pcre **r, char *buffer) { > > - const char *error; > > - int error_offset; > > +build_regexp(pcre2_code **r, char *buffer) { > > + int error; > > + PCRE2_SIZE error_offset; > > if (*r) > > - pcre_free(*r); > > - *r = pcre_compile(buffer, PCRE_CASELESS, &error, &error_offset, NULL); > > - if (error) { > > - log_error("pcre=%s, error=%s\n", buffer, error ? error: "none"); > > + pcre2_code_free(*r); > > + *r = pcre2_compile((PCRE2_SPTR8) buffer, PCRE2_ZERO_TERMINATED, PCRE2_CASELESS, &error, &error_offset, NULL); > > + if (!*r) { > > + PCRE2_UCHAR errbuf[256]; > > + pcre2_get_error_message(error, errbuf, sizeof(errbuf)); > > SELinuxProject/selinux/master/.git/worktrees/patchwork/rebase-apply/patch:127: space before tab in indent. > pcre2_get_error_message(error, errbuf, sizeof(errbuf)); > > > > + log_error("pcre compilation of '%s' failed at offset %zu: %s\n", buffer, error_offset, errbuf); > > } > > buffer[0] = '\0'; > > } > > @@ -1088,12 +1089,12 @@ compute_raw_from_trans(const char *level, domain_t *domain) { > > #endif > > > > int rc = 0; > > - int ovector[OVECCOUNT]; > > + pcre2_match_data *match_data = NULL; > > word_group_t *g = NULL; > > char *work = NULL; > > char *r = NULL; > > - const char * match = NULL; > > - int work_len; > > + char *match = NULL; > > + size_t work_len; > > mls_level_t *mraw = NULL; > > ebitmap_t set, clear, tmp; > > > > @@ -1114,11 +1115,20 @@ compute_raw_from_trans(const char *level, domain_t *domain) { > > if (!domain->base_classification_regexp) > > goto err; > > log_debug(" compute_raw_from_trans work = %s\n", work); > > - rc = pcre_exec(domain->base_classification_regexp, 0, work, work_len, 0, PCRE_ANCHORED, ovector, OVECCOUNT); > > + match_data = pcre2_match_data_create_from_pattern(domain->base_classification_regexp, NULL); > > + if (!match_data) { > > + log_error("allocation error %s", strerror(errno)); > > + goto err; > > + } > > + rc = pcre2_match(domain->base_classification_regexp, (PCRE2_SPTR8)work, work_len, 0, PCRE2_ANCHORED, match_data, NULL); > > if (rc > 0) { > > - match = NULL; > > - pcre_get_substring(work, ovector, rc, 0, &match); > > - log_debug(" compute_raw_from_trans match = %s len = %u\n", match, strlen(match)); > > + const PCRE2_SIZE *ovector = pcre2_get_ovector_pointer(match_data); > > + match = strndup(work + ovector[0], ovector[1] - ovector[0]); > > + if (!match) { > > + log_error("allocation error %s", strerror(errno)); > > + goto err; > > + } > > + log_debug(" compute_raw_from_trans match = %s len = %zu\n", match, strlen(match)); > > base_classification_t *bc; > > for (bc = domain->base_classifications; bc; bc = bc->next) { > > if (!strcmp(bc->trans, match)) { > > @@ -1138,12 +1148,23 @@ compute_raw_from_trans(const char *level, domain_t *domain) { > > char *p=work + ovector[0] + ovector[1]; > > while (*p && (strchr(" ", *p) != NULL)) > > *p++ = '#'; > > - pcre_free((char *)match); > > + > > + free(match); > > match = NULL; > > } else { > > - log_debug(" compute_raw_from_trans no base classification matched %s\n", level); > > + switch (rc) { > > + case PCRE2_ERROR_NOMATCH: > > + log_debug(" compute_raw_from_trans no base classification matched %s\n", level); > > + break; > > + default: > > + log_error("compute_raw_from_trans: base matching error for input '%s': %d\n", level, rc); > > + break; > > + } > > } > > > > SELinuxProject/selinux/master/.git/worktrees/patchwork/rebase-apply/patch:190: trailing whitespace. > > > > > > > + pcre2_match_data_free(match_data); > > + match_data = NULL; > > + > > if (mraw == NULL) { > > goto err; > > } > > @@ -1154,23 +1175,43 @@ compute_raw_from_trans(const char *level, domain_t *domain) { > > change = 0; > > for (g = domain->groups; g && !change && !complete; g = g->next) { > > int prefix = 0, suffix = 0; > > - int prefix_offset = 0, prefix_len = 0; > > - int suffix_offset = 0, suffix_len = 0; > > + PCRE2_SIZE prefix_offset = 0, prefix_len = 0; > > + PCRE2_SIZE suffix_offset = 0, suffix_len = 0; > > if (g->prefix_regexp) { > > - rc = pcre_exec(g->prefix_regexp, 0, work, work_len, 0, 0, ovector, OVECCOUNT); > > + match_data = pcre2_match_data_create_from_pattern(g->prefix_regexp, NULL); > > + if (!match_data) { > > + log_error("allocation error %s", strerror(errno)); > > + goto err; > > + } > > + rc = pcre2_match(g->prefix_regexp, (PCRE2_SPTR8)work, work_len, 0, 0, match_data, NULL); > > if (rc > 0) { > > + const PCRE2_SIZE *ovector = pcre2_get_ovector_pointer(match_data); > > prefix = 1; > > prefix_offset = ovector[0]; > > prefix_len = ovector[1] - ovector[0]; > > + } else if (rc != PCRE2_ERROR_NOMATCH) { > > + log_error("compute_raw_from_trans: prefix matching error for input '%s': %d\n", level, rc); > > } > > + pcre2_match_data_free(match_data); > > + match_data = NULL; > > } > > if (g->suffix_regexp) { > > - rc = pcre_exec(g->suffix_regexp, 0, work, work_len, 0, 0, ovector, OVECCOUNT); > > + match_data = pcre2_match_data_create_from_pattern(g->suffix_regexp, NULL); > > + if (!match_data) { > > + log_error("allocation error %s", strerror(errno)); > > + goto err; > > + } > > + rc = pcre2_match(g->suffix_regexp, (PCRE2_SPTR8)work, work_len, 0, 0, match_data, NULL); > > if (rc > 0) { > > + const PCRE2_SIZE *ovector = pcre2_get_ovector_pointer(match_data); > > suffix = 1; > > suffix_offset = ovector[0]; > > suffix_len = ovector[1] - ovector[0]; > > + } else if (rc != PCRE2_ERROR_NOMATCH) { > > + log_error("compute_raw_from_trans: suffix matching error for input '%s': %d\n", level, rc); > > } > > + pcre2_match_data_free(match_data); > > + match_data = NULL; > > } > > > > /* anchors prefix ^, suffix $ */ > > @@ -1179,14 +1220,23 @@ compute_raw_from_trans(const char *level, domain_t *domain) { > > (g->suffixes && suffix)) && > > g->word_regexp) { > > char *s = work + prefix_offset + prefix_len; > > - int l = (suffix_len ? suffix_offset : work_len) - prefix_len - prefix_offset; > > - rc = pcre_exec(g->word_regexp, 0, s, l, 0, 0, ovector, OVECCOUNT); > > + PCRE2_SIZE len = (suffix_len ? suffix_offset : work_len) - prefix_len - prefix_offset; > > + match_data = pcre2_match_data_create_from_pattern(g->word_regexp, NULL); > > + if (!match_data) { > > + log_error("allocation error %s", strerror(errno)); > > + goto err; > > + } > > + rc = pcre2_match(g->word_regexp, (PCRE2_SPTR8)s, len, 0, 0, match_data, NULL); > > if (rc > 0) { > > - match = NULL; > > - pcre_get_substring(s, ovector, rc, 0, &match); > > - trim((char *)match, g->whitespace); > > + const PCRE2_SIZE *ovector = pcre2_get_ovector_pointer(match_data); > > + match = strndup(s + ovector[0], ovector[1] - ovector[0]); > > + if (!match) { > > + log_error("allocation error %s", strerror(errno)); > > + goto err; > > + } > > + trim(match, g->whitespace); > > if (*match) { > > - char *p = triml((char *)match, g->whitespace); > > + char *p = triml(match, g->whitespace); > > while (p && *p) { > > int plen = strlen(p); > > unsigned int i; > > @@ -1223,9 +1273,13 @@ compute_raw_from_trans(const char *level, domain_t *domain) { > > memset(work + suffix_offset, '#', suffix_len); > > memset(s + ovector[0], '#', ovector[1] - ovector[0]); > > } > > - pcre_free((void *)match); > > + free(match); > > match = NULL; > > + } else if (rc != PCRE2_ERROR_NOMATCH) { > > + log_error("compute_raw_from_trans: word matching error for input '%s' for substring '%s': %d\n", level, s, rc); > > } > > + pcre2_match_data_free(match_data); > > + match_data = NULL; > > } > > /* YYY */ > > complete=1; > > @@ -1264,10 +1318,11 @@ err: > > mls_level_destroy(mraw); > > free(mraw); > > free(work); > > - pcre_free((void *)match); > > + free(match); > > ebitmap_destroy(&tmp); > > ebitmap_destroy(&set); > > ebitmap_destroy(&clear); > > + pcre2_match_data_free(match_data); > > return NULL; > > } > > > > diff --git a/mcstrans/utils/Makefile b/mcstrans/utils/Makefile > > index 9dfe7723..a48f4e72 100644 > > --- a/mcstrans/utils/Makefile > > +++ b/mcstrans/utils/Makefile > > @@ -14,13 +14,13 @@ endif > > all: $(TARGETS) > > > > transcon: transcon.o ../src/mcstrans.o ../src/mls_level.o $(LIBSEPOLA) > > - $(CC) $(LDFLAGS) -o $@ $^ -lpcre -lselinux $(LDLIBS_LIBSEPOLA) > > + $(CC) $(LDFLAGS) -o $@ $^ $(PCRE_LDLIBS) -lselinux $(LDLIBS_LIBSEPOLA) > > > > untranscon: untranscon.o ../src/mcstrans.o ../src/mls_level.o $(LIBSEPOLA) > > - $(CC) $(LDFLAGS) -o $@ $^ -lpcre -lselinux $(LDLIBS_LIBSEPOLA) > > + $(CC) $(LDFLAGS) -o $@ $^ $(PCRE_LDLIBS) -lselinux $(LDLIBS_LIBSEPOLA) > > > > %.o: %.c > > - $(CC) $(CFLAGS) -D_GNU_SOURCE -I../src -fPIE -c -o $@ $< > > + $(CC) $(CFLAGS) $(PCRE_CFLAGS) -D_GNU_SOURCE -I../src -fPIE -c -o $@ $< > > > > install: all > > -mkdir -p $(DESTDIR)$(SBINDIR) > > -- > > 2.34.1 >