Blame SOURCES/file-5.39-regex-caching-4.patch

8a9804
diff --git a/src/apprentice.c b/src/apprentice.c
8a9804
index 781c5e1..50a91cf 100644
8a9804
--- a/src/apprentice.c
8a9804
+++ b/src/apprentice.c
8a9804
@@ -2724,11 +2724,9 @@ getvalue(struct magic_set *ms, struct magic *m, const char **p, int action)
8a9804
 			file_regex_t rx;
8a9804
 			int rc = file_regcomp(ms, &rx, m->value.s,
8a9804
 			    REG_EXTENDED);
8a9804
-			if (rc) {
8a9804
-				if (ms->flags & MAGIC_CHECK)
8a9804
-					file_regerror(&rx, rc, ms);
8a9804
+			if (rc == 0) {
8a9804
+				file_regfree(&rx);
8a9804
 			}
8a9804
-			file_regfree(&rx);
8a9804
 			return rc ? -1 : 0;
8a9804
 		}
8a9804
 		return 0;
8a9804
diff --git a/src/file.h b/src/file.h
8a9804
index f049446..ee15855 100644
8a9804
--- a/src/file.h
8a9804
+++ b/src/file.h
8a9804
@@ -171,11 +171,7 @@
8a9804
 #define FILE_COMPILE	2
8a9804
 #define FILE_LIST	3
8a9804
 
8a9804
-typedef struct {
8a9804
-	const char *pat;
8a9804
-	int rc;
8a9804
-	regex_t rx;
8a9804
-} file_regex_t;
8a9804
+typedef regex_t file_regex_t;
8a9804
 
8a9804
 struct buffer {
8a9804
 	int fd;
8a9804
@@ -576,7 +572,6 @@ protected int file_regcomp(struct magic_set *, file_regex_t *, const char *,
8a9804
 protected int file_regexec(struct magic_set *, file_regex_t *, const char *,
8a9804
     size_t, regmatch_t *, int);
8a9804
 protected void file_regfree(file_regex_t *);
8a9804
-protected void file_regerror(file_regex_t *, int, struct magic_set *);
8a9804
 
8a9804
 typedef struct {
8a9804
 	char *buf;
8a9804
diff --git a/src/funcs.c b/src/funcs.c
8a9804
index 1391a44..df436eb 100644
8a9804
--- a/src/funcs.c
8a9804
+++ b/src/funcs.c
8a9804
@@ -614,9 +614,7 @@ file_replace(struct magic_set *ms, const char *pat, const char *rep)
8a9804
 	int rc, rv = -1;
8a9804
 
8a9804
 	rc = file_regcomp(ms, &rx, pat, REG_EXTENDED);
8a9804
-	if (rc) {
8a9804
-		file_regerror(&rx, rc, ms);
8a9804
-	} else {
8a9804
+	if (rc == 0) {
8a9804
 		regmatch_t rm;
8a9804
 		int nm = 0;
8a9804
 		while (file_regexec(ms, &rx, ms->o.buf, 1, &rm, 0) == 0) {
8a9804
@@ -644,16 +642,22 @@ file_regcomp(struct magic_set *ms, file_regex_t *rx, const char *pat, int flags)
8a9804
 	strlcpy(old, setlocale(LC_CTYPE, NULL), sizeof(old));
8a9804
 	(void)setlocale(LC_CTYPE, "C");
8a9804
 #endif
8a9804
-	rx->pat = pat;
8a9804
-
8a9804
-	rx->rc = regcomp(&rx->rx, pat, flags);
8a9804
+	int rc;
8a9804
+	rc = regcomp(rx, pat, flags);
8a9804
 
8a9804
 #ifdef USE_C_LOCALE
8a9804
 	uselocale(old);
8a9804
 #else
8a9804
 	(void)setlocale(LC_CTYPE, old);
8a9804
 #endif
8a9804
-	return rx->rc;
8a9804
+	if (rc > 0 && (ms->flags & MAGIC_CHECK)) {
8a9804
+		char errmsg[512];
8a9804
+
8a9804
+		(void)regerror(rc, rx, errmsg, sizeof(errmsg));
8a9804
+		file_magerror(ms, "regex error %d for `%s', (%s)", rc, pat,
8a9804
+		    errmsg);
8a9804
+	}
8a9804
+	return rc;
8a9804
 }
8a9804
 
8a9804
 protected int
8a9804
@@ -669,11 +673,10 @@ file_regexec(struct magic_set *ms, file_regex_t *rx, const char *str,
8a9804
 	(void)setlocale(LC_CTYPE, "C");
8a9804
 #endif
8a9804
 	int rc;
8a9804
-	assert(rx->rc == 0);
8a9804
 	/* XXX: force initialization because glibc does not always do this */
8a9804
 	if (nmatch != 0)
8a9804
 		memset(pmatch, 0, nmatch * sizeof(*pmatch));
8a9804
-	rc = regexec(&rx->rx, str, nmatch, pmatch, eflags);
8a9804
+	rc = regexec(rx, str, nmatch, pmatch, eflags);
8a9804
 #ifdef USE_C_LOCALE
8a9804
 	uselocale(old);
8a9804
 #else
8a9804
@@ -685,18 +688,7 @@ file_regexec(struct magic_set *ms, file_regex_t *rx, const char *str,
8a9804
 protected void
8a9804
 file_regfree(file_regex_t *rx)
8a9804
 {
8a9804
-	if (rx->rc == 0)
8a9804
-		regfree(&rx->rx);
8a9804
-}
8a9804
-
8a9804
-protected void
8a9804
-file_regerror(file_regex_t *rx, int rc, struct magic_set *ms)
8a9804
-{
8a9804
-	char errmsg[512];
8a9804
-
8a9804
-	(void)regerror(rc, &rx->rx, errmsg, sizeof(errmsg));
8a9804
-	file_magerror(ms, "regex error %d for `%s', (%s)", rc, rx->pat,
8a9804
-	    errmsg);
8a9804
+	regfree(rx);
8a9804
 }
8a9804
 
8a9804
 protected file_pushbuf_t *
8a9804
diff --git a/src/softmagic.c b/src/softmagic.c
8a9804
index b4052a6..f469a12 100644
8a9804
--- a/src/softmagic.c
8a9804
+++ b/src/softmagic.c
8a9804
@@ -474,14 +474,13 @@ check_fmt(struct magic_set *ms, const char *fmt)
8a9804
 {
8a9804
 	file_regex_t rx;
8a9804
 	int rc, rv = -1;
8a9804
+        const char* pat = "%[-0-9\\.]*s";
8a9804
 
8a9804
 	if (strchr(fmt, '%') == NULL)
8a9804
 		return 0;
8a9804
 
8a9804
-	rc = file_regcomp(ms, &rx, "%[-0-9\\.]*s", REG_EXTENDED|REG_NOSUB);
8a9804
-	if (rc) {
8a9804
-		file_regerror(&rx, rc, ms);
8a9804
-	} else {
8a9804
+	rc = file_regcomp(ms, &rx, pat, REG_EXTENDED|REG_NOSUB);
8a9804
+	if (rc == 0) {
8a9804
 		rc = file_regexec(ms, &rx, fmt, 0, 0, 0);
8a9804
 		rv = !rc;
8a9804
 	}
8a9804
@@ -2008,9 +2007,6 @@ alloc_regex(struct magic_set *ms, struct magic *m)
8a9804
 	if (rc == 0)
8a9804
 		return rx;
8a9804
 
8a9804
-fprintf(stderr, "regcomp %s %d\n", m->value.s, rc);
8a9804
-	file_regerror(rx, rc, ms);
8a9804
-	file_regfree(rx);
8a9804
 	free(rx);
8a9804
 	return NULL;
8a9804
 }
8a9804
@@ -2243,12 +2239,9 @@ magiccheck(struct magic_set *ms, struct magic *m, file_regex_t **m_cache)
8a9804
 			break;
8a9804
 
8a9804
 		default:
8a9804
-			file_regerror(rx, rc, ms);
8a9804
-			v = CAST(uint64_t, -1);
8a9804
+			return -1;
8a9804
 			break;
8a9804
 		}
8a9804
-		if (v == CAST(uint64_t, -1))
8a9804
-			return -1;
8a9804
 		break;
8a9804
 	}
8a9804
 	case FILE_INDIRECT: