[PATCH] xregcomp: don't consider every regex compilation failure an internal error.

Subject: [PATCH] xregcomp: don't consider every regex compilation failure an internal error.

Date: Sun, 23 Oct 2011 18:51:13 -0300

To: notmuch@notmuchmail.org

Cc: David Bremner

From: David Bremner


From: David Bremner <bremner@debian.org>

This pushes the error handling up one step, but makes the function
more flexible. Running out of memory still triggers an internal error,
in the spirit of other xutils functions.
---

And here is the promised modification of xregcomp.  One issue I
thought about is that we now have a(nother) place where a library
routine is writing to stderr, not necessarily in the process of
shutting down.

 notmuch-restore.c |    7 ++++---
 util/xutil.c      |    7 +++++--
 util/xutil.h      |    3 ++-
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/notmuch-restore.c b/notmuch-restore.c
index ff1ebab..13b4325 100644
--- a/notmuch-restore.c
+++ b/notmuch-restore.c
@@ -88,9 +88,10 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
      * non-space characters for the message-id, then one or more
      * spaces, then a list of space-separated tags as a sequence of
      * characters within literal '(' and ')'. */
-    xregcomp (&regex,
-	      "^([^ ]+) \\(([^)]*)\\)$",
-	      REG_EXTENDED);
+    if ( xregcomp (&regex,
+		   "^([^ ]+) \\(([^)]*)\\)$",
+		   REG_EXTENDED) )
+	INTERNAL_ERROR("compile time constant regex failed.");
 
     while ((line_len = getline (&line, &line_size, input)) != -1) {
 	regmatch_t match[3];
diff --git a/util/xutil.c b/util/xutil.c
index 15ff765..ac496da 100644
--- a/util/xutil.c
+++ b/util/xutil.c
@@ -99,7 +99,7 @@ xstrndup (const char *s, size_t n)
     return ret;
 }
 
-void
+int
 xregcomp (regex_t *preg, const char *regex, int cflags)
 {
     int rerr;
@@ -110,9 +110,12 @@ xregcomp (regex_t *preg, const char *regex, int cflags)
 	char *error = xmalloc (error_size);
 
 	regerror (rerr, preg, error, error_size);
-	INTERNAL_ERROR ("compiling regex %s: %s\n",
+	fprintf (stderr, "compiling regex %s: %s\n",
 			regex, error);
+	free (error);
+	return 1;
     }
+    return 0;
 }
 
 int
diff --git a/util/xutil.h b/util/xutil.h
index fd77f73..9299256 100644
--- a/util/xutil.h
+++ b/util/xutil.h
@@ -43,7 +43,8 @@ xstrdup (const char *s);
 char *
 xstrndup (const char *s, size_t n);
 
-void
+/* Returns 0 for successful compilation, 1 otherwise */
+int
 xregcomp (regex_t *preg, const char *regex, int cflags);
 
 int
-- 
1.7.6.3


Thread: