]> git.llucax.com Git - software/mutt-debian.git/blobdiff - hook.c
Merge commit 'upstream/1.5.20'
[software/mutt-debian.git] / hook.c
diff --git a/hook.c b/hook.c
index bee3c4878c9bb990b33abf608f87a1cc6ed29a90..d71cdf7dfd0c86d8062fcf24a55632214fcd495d 100644 (file)
--- a/hook.c
+++ b/hook.c
@@ -1,5 +1,5 @@
 /* 
 /* 
- * Copyright (C) 1996-2002 Michael R. Elkins <me@mutt.org>, and others
+ * Copyright (C) 1996-2002,2004,2007 Michael R. Elkins <me@mutt.org>, and others
  *
  *     This program is free software; you can redistribute it and/or modify
  *     it under the terms of the GNU General Public License as published by
  *
  *     This program is free software; you can redistribute it and/or modify
  *     it under the terms of the GNU General Public License as published by
@@ -426,7 +426,7 @@ void mutt_select_fcc (char *path, size_t pathlen, HEADER *hdr)
     else
       strfcpy (path, NONULL (Outbox), pathlen);
   }
     else
       strfcpy (path, NONULL (Outbox), pathlen);
   }
-  mutt_pretty_mailbox (path);
+  mutt_pretty_mailbox (path, pathlen);
 }
 
 static char *_mutt_string_hook (const char *match, int hook)
 }
 
 static char *_mutt_string_hook (const char *match, int hook)
@@ -460,11 +460,19 @@ char *mutt_crypt_hook (ADDRESS *adr)
 #ifdef USE_SOCKET
 void mutt_account_hook (const char* url)
 {
 #ifdef USE_SOCKET
 void mutt_account_hook (const char* url)
 {
+  /* parsing commands with URLs in an account hook can cause a recursive
+   * call. We just skip processing if this occurs. Typically such commands
+   * belong in a folder-hook -- perhaps we should warn the user. */
+  static int inhook = 0;
+
   HOOK* hook;
   BUFFER token;
   BUFFER err;
   char buf[STRING];
 
   HOOK* hook;
   BUFFER token;
   BUFFER err;
   char buf[STRING];
 
+  if (inhook)
+    return;
+
   err.data = buf;
   err.dsize = sizeof (buf);
   memset (&token, 0, sizeof (token));
   err.data = buf;
   err.dsize = sizeof (buf);
   memset (&token, 0, sizeof (token));
@@ -476,14 +484,19 @@ void mutt_account_hook (const char* url)
 
     if ((regexec (hook->rx.rx, url, 0, NULL, 0) == 0) ^ hook->rx.not)
     {
 
     if ((regexec (hook->rx.rx, url, 0, NULL, 0) == 0) ^ hook->rx.not)
     {
+      inhook = 1;
+
       if (mutt_parse_rc_line (hook->command, &token, &err) == -1)
       {
        FREE (&token.data);
        mutt_error ("%s", err.data);
        mutt_sleep (1);
 
       if (mutt_parse_rc_line (hook->command, &token, &err) == -1)
       {
        FREE (&token.data);
        mutt_error ("%s", err.data);
        mutt_sleep (1);
 
+        inhook = 0;
        return;
       }
        return;
       }
+
+      inhook = 0;
     }
   }
 
     }
   }