]> granicus.if.org Git - neomutt/commitdiff
Use realpath() in mutt_pretty_mailbox() for paths that may need it.
authorRocco Rutte <pdmef@gmx.net>
Wed, 2 Jul 2008 09:19:14 +0000 (11:19 +0200)
committerRocco Rutte <pdmef@gmx.net>
Wed, 2 Jul 2008 09:19:14 +0000 (11:19 +0200)
This requires to add the buffer size as parameter since the result may
be longer than the original but still fit in the buffer. Closes #2948.

18 files changed:
ChangeLog
browser.c
buffy.c
commands.c
compose.c
curs_main.c
enter.c
headers.c
hook.c
imap/imap.c
init.c
mbox.c
muttlib.c
postpone.c
protos.h
recvattach.c
send.c
status.c

index 5eae52516cc3499f4b8f2e184465085132dd37f3..c299c07442145567b37394f8c0327e80e2be2652 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2008-07-02 10:06 +0200  Rocco Rutte  <pdmef@gmx.net>  (cc2334fdf126)
+
+       * hash.c: Use casts to avoid triggering integer overflow detection in
+       hash function
+
+2008-07-01 20:06 -0700  Vincent Lefevre  <vincent@vinc17.org>  (fb0df4ae0836)
+
+       * ChangeLog, curs_lib.c: Clamp timeval math to unsigned int to match
+       progress timestamps. This is fine since only relative differences
+       matter. Closes #3018.
+
 2008-07-01 18:29 -0700  Brendan Cully  <brendan@kublai.com>  (f9af0501d2dd)
 
        * crypt-gpgme.c: Set GPGME locale on first attempt to create context.
index 0d01221690a2dac69bd5afb4456f447cab938a3d..4d76f7db444456a793ef03263d6e28f48eef57ed 100644 (file)
--- a/browser.c
+++ b/browser.c
@@ -462,7 +462,7 @@ static int examine_mailboxes (MUTTMENU *menu, struct browser_state *state)
       continue;
     
     strfcpy (buffer, NONULL(tmp->path), sizeof (buffer));
-    mutt_pretty_mailbox (buffer);
+    mutt_pretty_mailbox (buffer, sizeof (buffer));
 
     add_folder (menu, state, buffer, &s, tmp->new);
   }
@@ -508,7 +508,7 @@ static void init_menu (struct browser_state *state, MUTTMENU *menu, char *title,
   else
   {
     strfcpy (path, LastDir, sizeof (path));
-    mutt_pretty_mailbox (path);
+    mutt_pretty_mailbox (path, sizeof (path));
 #ifdef USE_IMAP
   if (state->imap_browse && option (OPTIMAPLSUB))
     snprintf (title, titlelen, _("Subscribed [%s], File mask: %s"),
diff --git a/buffy.c b/buffy.c
index 41e691509fed029eb507d4beafa524eabec0886a..8a3f6fce19bde3ab208b9d9184c6dfa30e1a0d59 100644 (file)
--- a/buffy.c
+++ b/buffy.c
@@ -429,7 +429,7 @@ int mutt_buffy_list (void)
       continue;
 
     strfcpy (path, tmp->path, sizeof (path));
-    mutt_pretty_mailbox (path);
+    mutt_pretty_mailbox (path, sizeof (path));
     
     if (!first && pos + strlen (path) >= COLS - 7)
       break;
@@ -502,7 +502,7 @@ void mutt_buffy (char *s, size_t slen)
       break;
     }
     strfcpy (s, tmp->path, slen);
-    mutt_pretty_mailbox (s);
+    mutt_pretty_mailbox (s, slen);
     break;
 
   default:
@@ -528,7 +528,7 @@ void mutt_buffy (char *s, size_t slen)
       break;
     }
     strfcpy (s, tmp->path, slen);
-    mutt_pretty_mailbox (s);
+    mutt_pretty_mailbox (s, slen);
     break;
   }
 }
index 69d561bbdb4481aaf02d6b11d8e1795efd86b68b..19d9427e38b694b12e026579f1c8f422dcdc853c 100644 (file)
@@ -758,7 +758,7 @@ int mutt_save_message (HEADER *h, int delete,
     }
   }
 
-  mutt_pretty_mailbox (buf);
+  mutt_pretty_mailbox (buf, sizeof (buf));
   if (mutt_enter_fname (prompt, buf, sizeof (buf), redraw, 0) == -1)
     return (-1);
 
index 0957bba810de221482e67ff087f3abccb2da4151..8de9fec95d754c421c51faf7923f9977734e9b1f 100644 (file)
--- a/compose.c
+++ b/compose.c
@@ -217,7 +217,7 @@ check_attachments(ATTACHPTR **idx, short idxlen)
     strfcpy(pretty, idx[i]->content->filename, sizeof(pretty));
     if(stat(idx[i]->content->filename, &st) != 0)
     {
-      mutt_pretty_mailbox(pretty);
+      mutt_pretty_mailbox(pretty, sizeof (pretty));
       mutt_error(_("%s [#%d] no longer exists!"),
                 pretty, i+1);
       return -1;
@@ -225,7 +225,7 @@ check_attachments(ATTACHPTR **idx, short idxlen)
     
     if(idx[i]->content->stamp < st.st_mtime)
     {
-      mutt_pretty_mailbox(pretty);
+      mutt_pretty_mailbox(pretty, sizeof (pretty));
       snprintf(msg, sizeof(msg), _("%s [#%d] modified. Update encoding?"),
               pretty, i+1);
       
@@ -568,8 +568,8 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
        strfcpy (buf, fcc, sizeof (buf));
        if (mutt_get_field ("Fcc: ", buf, sizeof (buf), M_FILE | M_CLEAR) == 0)
        {
-         strfcpy (fcc, buf, _POSIX_PATH_MAX);
-         mutt_pretty_mailbox (fcc);
+         strfcpy (fcc, buf, fcclen);
+         mutt_pretty_mailbox (fcc, fcclen);
          move (HDR_FCC, HDR_XOFFSET);
          mutt_paddstr (W, fcc);
          fccSet = 1;
@@ -717,7 +717,7 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
          if (Context)
          {
            strfcpy (fname, NONULL (Context->path), sizeof (fname));
-           mutt_pretty_mailbox (fname);
+           mutt_pretty_mailbox (fname, sizeof (fname));
          }
 
          if (mutt_enter_fname (prompt, fname, sizeof (fname), &menu->redraw, 1) == -1 || !fname[0])
@@ -1005,7 +1005,7 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
       case OP_COMPOSE_RENAME_FILE:
        CHECK_COUNT;
        strfcpy (fname, idx[menu->current]->content->filename, sizeof (fname));
-       mutt_pretty_mailbox (fname);
+       mutt_pretty_mailbox (fname, sizeof (fname));
        if (mutt_get_field (_("Rename to: "), fname, sizeof (fname), M_FILE)
                                                        == 0 && fname[0])
        {
@@ -1194,7 +1194,7 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
        if (Context)
        {
         strfcpy (fname, NONULL (Context->path), sizeof (fname));
-        mutt_pretty_mailbox (fname);
+        mutt_pretty_mailbox (fname, sizeof (fname));
        }
        if (idxlen)
          msg->content = idx[0]->content;
index e39c8d01776909482c8b97ac4d1c32ca439b9864..3bb60ed08b4293aef6c2a80bbbe148bc527bd83c 100644 (file)
@@ -1071,7 +1071,7 @@ int mutt_index_menu (void)
        if ((op == OP_MAIN_NEXT_UNREAD_MAILBOX) && Context && Context->path)
        {
          strfcpy (buf, Context->path, sizeof (buf));
-         mutt_pretty_mailbox (buf);
+         mutt_pretty_mailbox (buf, sizeof (buf));
          mutt_buffy (buf, sizeof (buf));
          if (!buf[0])
          {
diff --git a/enter.c b/enter.c
index 3e4d4e668df02dd0c702cb392685ee92881a236e..fc064d956ec96216ee9c1ca75c62728aa9509094 100644 (file)
--- a/enter.c
+++ b/enter.c
@@ -572,7 +572,7 @@ int _mutt_enter_string (char *buf, size_t buflen, int y, int x,
              set_option (OPTNEEDREDRAW);
              if (*buf)
              {
-               mutt_pretty_mailbox (buf);
+               mutt_pretty_mailbox (buf, buflen);
                if (!pass)
                  mutt_history_add (hclass, buf, 1);
                rv = 0;
index cace3a9cfc5bdabfafea7cf82eee1c2c8ff116fb..6ac21d8a114dc061dc2fbd854c8a6e5b8c843843 100644 (file)
--- a/headers.c
+++ b/headers.c
@@ -143,7 +143,7 @@ void mutt_edit_headers (const char *editor,
       if (*p)
       {
        strfcpy (fcc, p, fcclen);
-       mutt_pretty_mailbox (fcc);
+       mutt_pretty_mailbox (fcc, fcclen);
       }
       keep = 0;
     }
@@ -173,7 +173,7 @@ void mutt_edit_headers (const char *editor,
        }
        else
        {
-         mutt_pretty_mailbox (path);
+         mutt_pretty_mailbox (path, sizeof (path));
          mutt_error (_("%s: unable to attach file"), path);
        }
       }
diff --git a/hook.c b/hook.c
index bee3c4878c9bb990b33abf608f87a1cc6ed29a90..e44b88f2bb151b7d5c2b79c281a7326c9fdc8019 100644 (file)
--- a/hook.c
+++ b/hook.c
@@ -426,7 +426,7 @@ void mutt_select_fcc (char *path, size_t pathlen, HEADER *hdr)
     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)
index fec202987e2b2cefb3016f062ba102be0e8187b4..62bbdcf307183e74a3d30dd08dfab79b70e81911 100644 (file)
@@ -1990,7 +1990,7 @@ int imap_complete(char* dest, size_t dlen, char* path) {
   {
     /* reformat output */
     imap_qualify_path (dest, dlen, &mx, completion);
-    mutt_pretty_mailbox (dest);
+    mutt_pretty_mailbox (dest, dlen);
 
     FREE (&mx.mbox);
     return 0;
diff --git a/init.c b/init.c
index 2e5635bd377a215a44ec38a9d440dbdc00904339..3e5327f2a081b5398854d80fcf99acf681ae93ce 100644 (file)
--- a/init.c
+++ b/init.c
@@ -1856,7 +1856,7 @@ static int parse_set (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err)
        {
          _tmp[0] = '\0';
          strfcpy (_tmp, NONULL(*((char **) MuttVars[idx].data)), sizeof (_tmp));
-         mutt_pretty_mailbox (_tmp);
+         mutt_pretty_mailbox (_tmp, sizeof (_tmp));
          val = _tmp;
        }
        else
@@ -2618,7 +2618,7 @@ static int var_to_string (int idx, char* val, size_t len)
   {
     strfcpy (tmp, NONULL (*((char **) MuttVars[idx].data)), sizeof (tmp));
     if (DTYPE (MuttVars[idx].type) == DT_PATH)
-      mutt_pretty_mailbox (tmp);
+      mutt_pretty_mailbox (tmp, sizeof (tmp));
   }
   else if (DTYPE (MuttVars[idx].type) == DT_ADDR)
   {
diff --git a/mbox.c b/mbox.c
index bd55ee9d1cb82078e723e9082b7371b723f81d6e..ec3a02ffdfd7818407dea35496352d83ac4cbbcb 100644 (file)
--- a/mbox.c
+++ b/mbox.c
@@ -956,7 +956,7 @@ int mbox_sync_mailbox (CONTEXT *ctx, int *index_hint)
     rename (tempfile, savefile);
     mutt_unblock_signals ();
     mx_fastclose_mailbox (ctx);
-    mutt_pretty_mailbox (savefile);
+    mutt_pretty_mailbox (savefile, sizeof (savefile));
     mutt_error (_("Write failed!  Saved partial mailbox to %s"), savefile);
     mutt_sleep (5);
     return (-1);
index e0820da86e966b09f55d98a5b56ec658751bc991..510078b38a1f83d865ca79dd1086bc01049f8399 100644 (file)
--- a/muttlib.c
+++ b/muttlib.c
@@ -753,11 +753,12 @@ void mutt_free_alias (ALIAS **p)
 }
 
 /* collapse the pathname using ~ or = when possible */
-void mutt_pretty_mailbox (char *s)
+void mutt_pretty_mailbox (char *s, size_t buflen)
 {
   char *p = s, *q = s;
   size_t len;
   url_scheme_t scheme;
+  char tmp[_POSIX_PATH_MAX];
 
   scheme = url_check_scheme (s);
 
@@ -779,24 +780,34 @@ void mutt_pretty_mailbox (char *s)
       q = strchr (p, '\0');
     p = q;
   }
-  
-  /* first attempt to collapse the pathname */
-  while (*p)
+
+  /* cleanup path */
+  if (strstr (p, "//") || strstr (p, "/./"))
   {
-    if (*p == '/' && p[1] == '/')
-    {
-      *q++ = '/';
-      p += 2;
-    }
-    else if (p[0] == '/' && p[1] == '.' && p[2] == '/')
+    /* first attempt to collapse the pathname, this is more
+     * lightweight than realpath() and doesn't resolve links
+     */
+    while (*p)
     {
-      *q++ = '/';
-      p += 3;
+      if (*p == '/' && p[1] == '/')
+      {
+       *q++ = '/';
+       p += 2;
+      }
+      else if (p[0] == '/' && p[1] == '.' && p[2] == '/')
+      {
+       *q++ = '/';
+       p += 3;
+      }
+      else
+       *q++ = *p++;
     }
-    else
-      *q++ = *p++;
+    *q = 0;
   }
-  *q = 0;
+  else if (strstr (p, "..") && 
+          (scheme == U_UNKNOWN || scheme == U_FILE) &&
+          realpath (p, tmp))
+    strfcpy (p, tmp, buflen - (p - s));
 
   if (mutt_strncmp (s, Maildir, (len = mutt_strlen (Maildir))) == 0 &&
       s[len] == '/')
index bcb86072aab2df16d5748dbbf3b91bddf9a89bd5..2aa7e8cfcf8447e847ee006e70e6a52a6bdd0e60 100644 (file)
@@ -322,7 +322,7 @@ int mutt_get_postponed (CONTEXT *ctx, HEADER *hdr, HEADER **cur, char *fcc, size
       p = tmp->data + 11;
       SKIPWS (p);
       strfcpy (fcc, p, fcclen);
-      mutt_pretty_mailbox (fcc);
+      mutt_pretty_mailbox (fcc, fcclen);
 
       /* remove the X-Mutt-Fcc: header field */
       next = tmp->next;
index 72682bb095ed23461a2900edd9e9e635c11a5893..99a0e707aff908137e6c1587ea526bdba9736720 100644 (file)
--- a/protos.h
+++ b/protos.h
@@ -230,7 +230,7 @@ void mutt_parse_part (FILE *, BODY *);
 void mutt_perror (const char *);
 void mutt_prepare_envelope (ENVELOPE *, int);
 void mutt_unprepare_envelope (ENVELOPE *);
-void mutt_pretty_mailbox (char *);
+void mutt_pretty_mailbox (char *, size_t);
 void mutt_pretty_size (char *, size_t, LOFF_T);
 void mutt_pipe_message (HEADER *);
 void mutt_print_message (HEADER *);
index 1a4628819703dce0c1dba5a6430e9de238b29844..892751c25fe94cdf0c54f521753b26cdc99d2dd0 100644 (file)
@@ -254,7 +254,7 @@ const char *mutt_attach_fmt (char *dest,
          char path[_POSIX_PATH_MAX];
          
          strfcpy (path, aptr->content->filename, sizeof (path));
-         mutt_pretty_mailbox (path);
+         mutt_pretty_mailbox (path, sizeof (path));
          mutt_format_s (dest, destlen, prefix, path);
        }
        else
diff --git a/send.c b/send.c
index cd4d3617dc45b7994cb9d1aeaee4e0485c89e73c..2c00de0806329c1fa2f60170afe210a534855eab 100644 (file)
--- a/send.c
+++ b/send.c
@@ -1505,7 +1505,7 @@ ci_send_message (int flags,               /* send mode */
 main_loop:
 
     fcc_error = 0; /* reset value since we may have failed before */
-    mutt_pretty_mailbox (fcc);
+    mutt_pretty_mailbox (fcc, sizeof (fcc));
     i = mutt_compose_menu (msg, fcc, sizeof (fcc), cur);
     if (i == -1)
     {
index 09f76db3953b1ed837ba3b91a943efeb58d4a74e..8f19128d9d5e9653776e01c14f728d2f2dbfe867 100644 (file)
--- a/status.c
+++ b/status.c
@@ -99,7 +99,7 @@ status_format_str (char *buf, size_t buflen, size_t col, char op, const char *sr
       if (Context && Context->path)
       {
        strfcpy (tmp, Context->path, sizeof (tmp));
-       mutt_pretty_mailbox (tmp);
+       mutt_pretty_mailbox (tmp, sizeof (tmp));
       }
       else
        strfcpy (tmp, _("(no mailbox)"), sizeof (tmp));