Re: [PATCH v2 1/3] mcstrans: port to new PCRE2 from end-of-life PCRE

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

 



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
>




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

  Powered by Linux