From 0e7106da702d97e10f3bd24d8284a2ab86044ebd Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Sun, 13 Nov 2005 23:51:18 +0000 Subject: [PATCH] Use context/ctxpath==NULL to indicate that no context file should be read, to avoid inadvertently trying to lock /dev/null (takes 30secs+ with some locking methods). --- ChangeLog | 5 +++++ sbr/context_foil.c | 20 +++++++++++++++++++- sbr/context_read.c | 6 ++++++ sbr/context_save.c | 4 ++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 7661e8a..3d26966 100644 --- 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 * bug #7833: uip/Makefile.in: remove link to install-mh that caused diff --git a/sbr/context_foil.c b/sbr/context_foil.c index 9b3f7eb..d6c90c4 100644 --- a/sbr/context_foil.c +++ b/sbr/context_foil.c @@ -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 diff --git a/sbr/context_read.c b/sbr/context_read.c index 3084ff5..fcc12f9 100644 --- a/sbr/context_read.c +++ b/sbr/context_read.c @@ -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"))) { diff --git a/sbr/context_save.c b/sbr/context_save.c index 4fa60ea..36b1634 100644 --- a/sbr/context_save.c +++ b/sbr/context_save.c @@ -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; -- 1.7.10.4