Use context/ctxpath==NULL to indicate that no context file should be read,
authorPeter Maydell <pmaydell@chiark.greenend.org.uk>
Sun, 13 Nov 2005 23:51:18 +0000 (23:51 +0000)
committerPeter Maydell <pmaydell@chiark.greenend.org.uk>
Sun, 13 Nov 2005 23:51:18 +0000 (23:51 +0000)
to avoid inadvertently trying to lock /dev/null (takes 30secs+ with some
locking methods).

ChangeLog
sbr/context_foil.c
sbr/context_read.c
sbr/context_save.c

index 7661e8a..3d26966 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,11 @@
        * sbr/mf.c: fix buffer overrun with absurdly long addresses
        (only causes crashes if scan is run with '-width 16536' or similar)
 
+       * sbr/context_foil.c, sbr/context_read.c, sbr/context_save.c:
+       mark 'no context' with NULL rather than "/dev/null" so we don't
+       inadvertently try to lock /dev/null (which takes up to a minute
+       in some locking configurations and makes post very slow).
+
 2005-11-13  Oliver Kiddle  <okiddle@yahoo.co.uk>
 
        * bug #7833: uip/Makefile.in: remove link to install-mh that caused
index 9b3f7eb..d6c90c4 100644 (file)
@@ -21,7 +21,25 @@ context_foil (char *path)
 {
     register struct node *np;
 
-    defpath = context = "/dev/null";
+    /* In fact, nobody examines defpath in code paths where
+     * it's been set by us -- the uses in the source tree are:
+     *  1 sbr/context_read.c uses it only after setting it itself
+     *  2 uip/install_mh.c uses it only after setting it itself
+     *  3 uip/mshcmds.c and uip/mark.c print it if given the -debug switch
+     * A worthwhile piece of code cleanup would be to make 1 and
+     * 2 use a local variable and just delete 3.
+     *
+     * Similarly, context and ctxpath are not really used
+     * outside the context_* routines. It might be worth combining
+     * them into one file so the variables can be made static.
+     */
+
+    /* We set context to NULL to indicate that no context file
+     * is to be read. (Using /dev/null doesn't work because we
+     * would try to lock it, which causes timeouts with some
+     * locking methods.)
+     */
+    defpath = context = NULL;
 
     /*
      * If path is given, create a minimal profile/context list
index 3084ff5..fcc12f9 100644 (file)
@@ -120,6 +120,12 @@ context_read (void)
     if ((cp = getenv ("MHCONTEXT")) == (char *)0 || *cp == '\0')
        cp = context;
 
+    /* context is NULL if context_foil() was called to disable use of context */
+    if (!cp) {
+       ctxpath = NULL;
+       return;
+    }
+    
     ctxpath = getcpy (m_maildir (cp));
 
     if ((ib = lkfopen (ctxpath, "r"))) {
index 4fa60ea..36b1634 100644 (file)
@@ -25,6 +25,10 @@ context_save (void)
     register struct node *np;
     FILE *out;
     sigset_t set, oset;
+    
+    /* No context in use -- silently ignore any changes! */
+    if (!ctxpath)
+       return;
 
     if (!(ctxflags & CTXMOD))
        return;