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]

 



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>

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