commit-mailutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU Mailutils branch, master, updated. release-2.2-146-g2164243


From: Sergey Poznyakoff
Subject: [SCM] GNU Mailutils branch, master, updated. release-2.2-146-g2164243
Date: Mon, 11 Oct 2010 21:22:08 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Mailutils".

http://git.savannah.gnu.org/cgit/mailutils.git/commit/?id=2164243df618ab718f4d30c95174eab12178fb76

The branch, master has been updated
       via  2164243df618ab718f4d30c95174eab12178fb76 (commit)
       via  d3759d840f37fa6a56fcbe57b7bce8883f210593 (commit)
      from  e3ef44efce74604bf62cb630f172226afa91b76c (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 2164243df618ab718f4d30c95174eab12178fb76
Author: Sergey Poznyakoff <address@hidden>
Date:   Tue Oct 12 00:19:24 2010 +0300

    Improve mu_unroll_symlink interface.
    
    * include/mailutils/util.h (mu_readlink): New function.
    (mu_unroll_symlink): Change prototype.
    * libmailutils/base/symlink.c (mu_qualify_link): Remove.
    (mu_readlink): New function.
    (mu_unroll_symlink): Rewrite.  Don't use statically allocated
    buffers.
    * libmailutils/base/locker.c (mu_locker_create): Update calls to
    mu_unroll_symlink.

commit d3759d840f37fa6a56fcbe57b7bce8883f210593
Author: Sergey Poznyakoff <address@hidden>
Date:   Sun Oct 10 22:17:08 2010 +0300

    Use mu_make_file_name where necessary.
    
    * comsat/action.c (run_user_action): Use mu_make_file_name.
    * imap4d/lsub.c (imap4d_lsub): Likewise.
    * imap4d/subscribe.c (imap4d_subscribe): Likewise.
    * imap4d/unsubscribe.c (imap4d_unsubscribe): Likewise.
    * libmailutils/base/filename.c (mu_get_full_path): Likewise.
    * libmailutils/base/tempfile.c (mu_tempfile): Likewise.
    * libmailutils/base/url.c (_url_path_default): Likewise.
    * libmu_auth/virtual.c (getpwnam_virtual)
    (mu_auth_virt_domain_by_name): Likewise.
    * libmu_sieve/extensions/vacation.c (check_db): Likewise.
    * libmu_sieve/sieve.l (_try_include): Likewise.
    * maidag/forward.c (maidag_forward): Likewise.
    
    * mh/mh.h (mh_safe_make_file_name): New proto.
    * mh/mh_init.c (mh_audit_open,mh_get_dir)
    (mh_expand_name,mh_real_install): Use mh_safe_make_file_name.
    (mh_safe_make_file_name): New function.
    * mh/folder.c (read_seq_file, _scan): Use mh_safe_make_file_name.
    * mh/mh_global.c (mh_read_profile, _mh_init_global_sequences): Likewise.
    * mh/install-mh.c (main): Likewise.
    * mh/mhn.c (normalize_path, store_handler, main): Likewise.
    * mh/repl.c (make_draft): Likewise.
    * mh/rmf.c (rmf): Likewise.
    * mh/sortm.c (swap_message): Likewise.
    * mimeview/mimetypes.l (mimetypes_open): Likewise.
    
    * lib/mailcap.c: Add error checking.

-----------------------------------------------------------------------

Summary of changes:
 comsat/action.c                   |   10 ++-
 imap4d/lsub.c                     |    8 +-
 imap4d/subscribe.c                |    4 +-
 imap4d/unsubscribe.c              |    8 ++-
 include/mailutils/util.h          |    3 +-
 lib/mailcap.c                     |    4 +-
 libmailutils/base/filename.c      |    7 +--
 libmailutils/base/locker.c        |   13 ++--
 libmailutils/base/symlink.c       |  138 +++++++++++++++++++++++++------------
 libmailutils/base/tempfile.c      |    9 ++-
 libmailutils/base/url.c           |    7 +--
 libmu_auth/virtual.c              |    8 +--
 libmu_sieve/extensions/vacation.c |    3 +-
 libmu_sieve/sieve.l               |    8 ++-
 maidag/forward.c                  |    2 +-
 mh/folder.c                       |    8 +--
 mh/install-mh.c                   |    3 +-
 mh/mh.h                           |    2 +
 mh/mh_global.c                    |    4 +-
 mh/mh_init.c                      |   41 +++++++----
 mh/mhn.c                          |    9 +--
 mh/repl.c                         |    4 +-
 mh/rmf.c                          |    2 +-
 mh/sortm.c                        |    4 +-
 mimeview/mimetypes.l              |    2 +-
 25 files changed, 194 insertions(+), 117 deletions(-)

diff --git a/comsat/action.c b/comsat/action.c
index afba30f..0e1e679 100644
--- a/comsat/action.c
+++ b/comsat/action.c
@@ -375,9 +375,15 @@ run_user_action (FILE *tty, const char *cr, mu_message_t 
msg)
       char *cwd = mu_getcwd ();
       char *rcname;
 
-      mu_asprintf (&rcname, "%s/%s", cwd, BIFF_RC);
+      rcname = mu_make_file_name (cwd, BIFF_RC);
       free (cwd);
-      
+      if (!rcname)
+        {
+          mu_diag_funcall (MU_DIAG_ERROR, "mu_make_file_name", NULL, ENOMEM);
+          fclose (fp);
+          return;
+        }
+        
       mu_diag_get_debug (&debug);
       
       while ((n = act_getline (fp, &stmt, &size)))
diff --git a/imap4d/lsub.c b/imap4d/lsub.c
index d743c3c..2421f6b 100644
--- a/imap4d/lsub.c
+++ b/imap4d/lsub.c
@@ -34,8 +34,8 @@ imap4d_lsub (struct imap4d_command *command, imap4d_tokbuf_t 
tok)
 {
   char *ref;
   char *wcard;
-  char *file = NULL;
-  char *pattern = NULL;
+  char *file;
+  char *pattern;
   const char *delim = "/";
   FILE *fp;
   
@@ -45,11 +45,11 @@ imap4d_lsub (struct imap4d_command *command, 
imap4d_tokbuf_t tok)
   ref = imap4d_tokbuf_getarg (tok, IMAP4_ARG_1);
   wcard = imap4d_tokbuf_getarg (tok, IMAP4_ARG_2);
 
-  asprintf (&pattern, "%s%s", ref, wcard);
+  pattern = mu_make_file_name (ref, wcard);
   if (!pattern)
     return io_completion_response (command, RESP_NO, "Not enough memory");
   
-  asprintf (&file, "%s/.mailboxlist", real_homedir);
+  file = mu_make_file_name (real_homedir, ".mailboxlist");
   if (!file)
     {
       free (pattern);
diff --git a/imap4d/subscribe.c b/imap4d/subscribe.c
index 49feb90..6c24407 100644
--- a/imap4d/subscribe.c
+++ b/imap4d/subscribe.c
@@ -40,7 +40,9 @@ imap4d_subscribe (struct imap4d_command *command, 
imap4d_tokbuf_t tok)
 
   name = imap4d_tokbuf_getarg (tok, IMAP4_ARG_1);
 
-  asprintf (&file, "%s/.mailboxlist", real_homedir);
+  file = mu_make_file_name (real_homedir, ".mailboxlist");
+  if (!file)
+    return io_completion_response (command, RESP_NO, "Cannot subscribe");
   fp = fopen (file, "a");
   free (file);
   if (fp)
diff --git a/imap4d/unsubscribe.c b/imap4d/unsubscribe.c
index fb17bd8..108f7f3 100644
--- a/imap4d/unsubscribe.c
+++ b/imap4d/unsubscribe.c
@@ -99,7 +99,13 @@ imap4d_unsubscribe (struct imap4d_command *command, 
imap4d_tokbuf_t tok)
 
   name = imap4d_tokbuf_getarg (tok, IMAP4_ARG_1);
 
-  asprintf (&file, "%s/.mailboxlist", real_homedir);
+  file = mu_make_file_name (real_homedir, ".mailboxlist");
+  if (!file)
+    {
+      mu_diag_funcall (MU_DIAG_ERROR, "mu_make_file_name", NULL, ENOMEM);
+      return io_completion_response (command, RESP_NO, "Cannot unsubscribe");
+    }
+
   sd.result = 0;
   sd.name = name;
 
diff --git a/include/mailutils/util.h b/include/mailutils/util.h
index 57d11f0..3af373c 100644
--- a/include/mailutils/util.h
+++ b/include/mailutils/util.h
@@ -78,7 +78,8 @@ char *mu_normalize_path (char *path);
 char *mu_expand_path_pattern (const char *pattern, const char *username);
 char *mu_tilde_expansion (const char *ref, const char *delim,
                          const char *homedir);
-int mu_unroll_symlink (char *out, size_t outsz, const char *in);
+int mu_readlink (const char *name, char **pbuf, size_t *psize, size_t *plen);
+int mu_unroll_symlink (const char *name, char **pout);
 char *mu_getcwd (void);
 int mu_tempfile (const char *tmpdir, char **namep);
 char *mu_tempname (const char *tmpdir);
diff --git a/lib/mailcap.c b/lib/mailcap.c
index fd1c40a..e4f0b57 100644
--- a/lib/mailcap.c
+++ b/lib/mailcap.c
@@ -660,10 +660,12 @@ display_stream_mailcap (const char *ident, mu_stream_t 
stream, mu_header_t hdr,
       char *home = mu_get_homedir ();
       asprintf (&mailcap_path, "%s/.mailcap:%s", home, DEFAULT_MAILCAP);
       free (home);
+      if (!mailcap_path)
+        return 1;
     }
   else
     mailcap_path = strdup (mailcap_path);
-
+  
   obstack_init (&expand_stack);
   
   for (p = strtok_r (mailcap_path, ":", &sp); p; p = strtok_r (NULL, ":", &sp))
diff --git a/libmailutils/base/filename.c b/libmailutils/base/filename.c
index 97c4813..625fbb6 100644
--- a/libmailutils/base/filename.c
+++ b/libmailutils/base/filename.c
@@ -59,14 +59,11 @@ mu_get_full_path (const char *file)
       char *cwd = mu_getcwd ();
       if (cwd)
        {
-         p = calloc (strlen (cwd) + 1 + strlen (file) + 1, 1);
-         if (p)
-           sprintf (p, "%s/%s", cwd, file);
+         p = mu_make_file_name (cwd, file);
          free (cwd);
        }
     }
-
-  if (!p)
+  else
     p = strdup (file);
   return p;
 }
diff --git a/libmailutils/base/locker.c b/libmailutils/base/locker.c
index 99a1a4e..dc33fdc 100644
--- a/libmailutils/base/locker.c
+++ b/libmailutils/base/locker.c
@@ -437,7 +437,7 @@ mu_locker_create (mu_locker_t *plocker, const char *fname, 
int flags)
 {
   unsigned type;
   mu_locker_t l;
-  char filename[_POSIX_PATH_MAX];
+  char *filename;
   int err = 0;
 
   if (plocker == NULL)
@@ -446,15 +446,18 @@ mu_locker_create (mu_locker_t *plocker, const char 
*fname, int flags)
   if (fname == NULL)
     return EINVAL;
 
-  if ((err = mu_unroll_symlink (filename, sizeof (filename), fname)))
+  if ((err = mu_unroll_symlink (fname, &filename)))
     return err;
 
   l = calloc (1, sizeof (*l));
 
   if (l == NULL)
-    return ENOMEM;
-
-  l->file = strdup (filename);
+    {
+      free (filename);
+      return ENOMEM;
+    }
+  
+  l->file = filename;
   
   if (l->file == NULL)
     {
diff --git a/libmailutils/base/symlink.c b/libmailutils/base/symlink.c
index 7551a46..eafbd28 100644
--- a/libmailutils/base/symlink.c
+++ b/libmailutils/base/symlink.c
@@ -30,32 +30,73 @@
 #include <mailutils/types.h>
 #include <mailutils/util.h>
 
-/* The result of readlink() may be a path relative to that link, 
- * qualify it if necessary.
- */
-static void
-mu_qualify_link (const char *path, const char *link, char *qualified)
+#define INITIAL_READLINK_SIZE 128
+
+int
+mu_readlink (const char *name, char **pbuf, size_t *psize, size_t *plen)
 {
-  const char *lb = NULL;
-  size_t len;
+  size_t status = 0;
+  char *buf = *pbuf;
+  size_t size = *plen;
+  ssize_t linklen;
 
-  /* link is full path */
-  if (*link == '/')
+  while (1)
     {
-      mu_cpystr (qualified, link, _POSIX_PATH_MAX);
-      return;
+      if (!buf)
+       {
+         size = INITIAL_READLINK_SIZE;
+         buf = malloc (size);
+       }
+      else
+       {
+         char *p;
+         size_t newsize = size << 1;
+         if (newsize < size)
+           {
+             status = ENAMETOOLONG;
+             break;
+           }
+         size = newsize;
+         p = realloc (buf, size);
+         if (!p)
+           free (buf);
+         buf = p;
+       }
+      if (!buf)
+       {
+         status = ENOMEM;
+         break;
+       }
+      
+      linklen = readlink (name, buf, size);
+      if (linklen < 0 && errno != ERANGE)
+       {
+         status = errno;
+         break;
+       }
+
+      if ((size_t) linklen < size)
+       {
+         buf[linklen++] = '\0';
+         status = 0;
+         break;
+       }
     }
 
-  if ((lb = strrchr (path, '/')) == NULL)
+  if (status)
     {
-      /* no path in link */
-      mu_cpystr (qualified, link, _POSIX_PATH_MAX);
-      return;
+      if (buf)
+       {
+         free (buf);
+         buf = NULL;
+       }
+      size = 0;
     }
-
-  len = lb - path + 1;
-  memcpy (qualified, path, len);
-  mu_cpystr (qualified + len, link, _POSIX_PATH_MAX - len);
+  *pbuf = buf;
+  *psize = size;
+  if (plen)
+    *plen = linklen;
+  return status;
 }
 
 #ifndef _POSIX_SYMLOOP_MAX
@@ -63,41 +104,52 @@ mu_qualify_link (const char *path, const char *link, char 
*qualified)
 #endif
 
 int
-mu_unroll_symlink (char *out, size_t outsz, const char *in)
+mu_unroll_symlink (const char *name, char **pout)
 {
-  char path[_POSIX_PATH_MAX];
-  int symloops = 0;
+  size_t symloops = 0;
+  struct slbuf { char *base; size_t size; } buf[2];
+  int idx = 0;
+  int status;
+  
+  buf[0].base = buf[1].base = NULL;
+  buf[0].size = buf[1].size = 0;
 
   while (symloops++ < _POSIX_SYMLOOP_MAX)
     {
-      struct stat s;
-      char link[_POSIX_PATH_MAX];
-      char qualified[_POSIX_PATH_MAX];
-      int len;
+      struct stat st;
+      size_t len;
 
-      if (lstat (in, &s) == -1)
+      if (lstat (name, &st) == -1)
        return errno;
 
-      if (!S_ISLNK (s.st_mode))
+      if (!S_ISLNK (st.st_mode))
        {
-         mu_cpystr (path, in, sizeof (path));
+         if (!buf[idx].base)
+           {
+             buf[idx].base = strdup (name);
+             if (!buf[idx].base)
+               return ENOMEM;
+           }
+         status = 0;
          break;
        }
 
-      if ((len = readlink (in, link, sizeof (link))) == -1)
-       return errno;
-
-      link[(len >= sizeof (link)) ? (sizeof (link) - 1) : len] = '\0';
-
-      mu_qualify_link (in, link, qualified);
-
-      mu_cpystr (path, qualified, sizeof (path));
-
-      in = path;
+      idx = !idx;
+      status = mu_readlink (name, &buf[idx].base, &buf[idx].size, &len);
+      if (status)
+       break;
+      name = mu_normalize_path (buf[idx].base);
     }
 
-  mu_cpystr (out, path, outsz);
-
-  return 0;
+  if (status)
+    {
+      free (buf[0].base);
+      free (buf[1].base);
+    }
+  else
+    {
+      *pout = buf[idx].base;
+      free (buf[!idx].base);
+    }
+  return status;
 }
-
diff --git a/libmailutils/base/tempfile.c b/libmailutils/base/tempfile.c
index cbd6d96..951e039 100644
--- a/libmailutils/base/tempfile.c
+++ b/libmailutils/base/tempfile.c
@@ -31,6 +31,7 @@
 #include <mailutils/io.h>
 #include <mailutils/error.h>
 #include <mailutils/errno.h>
+#include <mailutils/util.h>
 
 /* Create and open a temporary file. Be very careful about it, since we
    may be running with extra privilege i.e setgid().
@@ -52,8 +53,12 @@ mu_tempfile (const char *tmpdir, char **namep)
   if (!tmpdir)
     tmpdir = (getenv ("TMPDIR")) ? getenv ("TMPDIR") : P_tmpdir;
 
-  if (mu_asprintf (&filename, "%s/muXXXXXX", tmpdir))
-    return -1;
+  filename = mu_make_file_name (tmpdir, "muXXXXXX");
+  if (!filename)
+    {
+      mu_diag_funcall (MU_DIAG_ERROR, "mu_make_file_name", NULL, ENOMEM);
+      return -1;
+    }
 
 #ifdef HAVE_MKSTEMP
   {
diff --git a/libmailutils/base/url.c b/libmailutils/base/url.c
index d177fa7..4f51071 100644
--- a/libmailutils/base/url.c
+++ b/libmailutils/base/url.c
@@ -956,12 +956,7 @@ mu_url_init (mu_url_t url, int port, const char *scheme)
 static char *
 _url_path_default (const char *spooldir, const char *user, int unused)
 {
-  char *mbox = malloc (strlen (spooldir) + strlen (user) + 2);
-  if (!mbox)
-    errno = ENOMEM;
-  else
-    sprintf (mbox, "%s/%s", spooldir, user);
-  return mbox;
+  return mu_make_file_name (spooldir, user);
 }
 
 /* Hashed indexing */
diff --git a/libmu_auth/virtual.c b/libmu_auth/virtual.c
index ad15352..d45b909 100644
--- a/libmu_auth/virtual.c
+++ b/libmu_auth/virtual.c
@@ -52,6 +52,7 @@
 #include <mailutils/mu_auth.h>
 #include <mailutils/nls.h>
 #include <mailutils/errno.h>
+#include <mailutils/util.h>
 
 #ifdef ENABLE_VIRTUAL_DOMAINS
 
@@ -89,12 +90,10 @@ getpwnam_virtual (const char *u)
   if (delim == 0)
     return NULL;
 
-  filename = malloc (strlen (mu_virtual_module_config.pwddir) +
-                    strlen (&u[delim + 1]) + 2 /* slash and null byte */);
+  filename = mu_make_file_name (mu_virtual_module_config.pwddir, &u[delim + 
1]);
   if (filename == NULL)
     return NULL;
 
-  sprintf (filename, "%s/%s", mu_virtual_module_config.pwddir, &u[delim + 1]);
   pfile = fopen (filename, "r");
   free (filename);
 
@@ -173,10 +172,9 @@ mu_auth_virt_domain_by_name (struct mu_auth_data 
**return_data,
        return MU_ERR_AUTH_FAILURE;
     }
   
-  mailbox_name = calloc (strlen (pw->pw_dir) + strlen ("/INBOX") + 1, 1);
+  mailbox_name = mu_make_file_name (pw->pw_dir, "INBOX");
   if (!mailbox_name)
     return ENOMEM;
-  sprintf (mailbox_name, "%s/INBOX", pw->pw_dir);
 
   rc = mu_auth_data_alloc (return_data,
                           pw->pw_name,
diff --git a/libmu_sieve/extensions/vacation.c 
b/libmu_sieve/extensions/vacation.c
index 323da50..3e3b595 100644
--- a/libmu_sieve/extensions/vacation.c
+++ b/libmu_sieve/extensions/vacation.c
@@ -300,7 +300,8 @@ check_db (mu_sieve_machine_t mach, mu_list_t tags, char 
*from)
 
   home = mu_get_homedir ();
 
-  if (asprintf (&file, "%s/.vacation", (home ? home : ".")) == -1)
+  file = mu_make_file_name (home ? home : ".", ".vacation");
+  if (!file)
     {
       mu_sieve_error (mach, _("%lu: cannot build db file name"),
                      (unsigned long) mu_sieve_get_message_num (mach));
diff --git a/libmu_sieve/sieve.l b/libmu_sieve/sieve.l
index 87a5dc6..2f60e13 100644
--- a/libmu_sieve/sieve.l
+++ b/libmu_sieve/sieve.l
@@ -349,11 +349,13 @@ static int
 _try_include (void *item, void *data)
 {
   char **dir = data;
-  char *name = malloc (strlen (item) + 1 + strlen (*dir) + 1);
+  char *name = mu_make_file_name ((char*) item, *dir);
 
   if (!name)
-    return 0;
-  sprintf (name, "%s/%s", (char*) item, *dir);
+    {
+      mu_diag_funcall (MU_DIAG_ERROR, "mu_make_file_name", NULL, ENOMEM);
+      return 0;
+    }
   if (access (name, R_OK) == 0)
     {
       *(char**) data = name;
diff --git a/maidag/forward.c b/maidag/forward.c
index 2bedd80..f64a3ae 100644
--- a/maidag/forward.c
+++ b/maidag/forward.c
@@ -342,7 +342,7 @@ maidag_forward (mu_message_t msg, struct mu_auth_data 
*auth, char *fwfile)
                      auth->dir, mu_strerror (errno));
          return maidag_forward_none;
        }
-      asprintf (&filename, "%s/%s", auth->dir, fwfile);
+      filename = mu_make_file_name (auth->dir, fwfile);
     }
   else
     filename = strdup (fwfile);
diff --git a/mh/folder.c b/mh/folder.c
index 5394f2b..6175594 100644
--- a/mh/folder.c
+++ b/mh/folder.c
@@ -275,9 +275,7 @@ read_seq_file (struct folder_info *info, const char 
*prefix, const char *name)
   mh_context_t *ctx;
   const char *p;
   
-  asprintf (&pname, "%s/%s", prefix, name);
-  if (!pname)
-    abort ();
+  pname = mh_safe_make_file_name (prefix, name);
   ctx = mh_context_create (pname, 1);
   mh_context_read (ctx);
   
@@ -350,7 +348,7 @@ _scan (const char *name, size_t depth)
        }
       else if (entry->d_name[0] != ',')
        {
-         asprintf (&p, "%s/%s", name, entry->d_name);
+         p = mh_safe_make_file_name (name, entry->d_name);
          if (stat (p, &st) < 0)
            mu_diag_funcall (MU_DIAG_ERROR, "stat", p, errno);
          else if (S_ISDIR (st.st_mode))
@@ -378,7 +376,7 @@ _scan (const char *name, size_t depth)
   
   if (info.cur)
     {
-      asprintf (&p, "%s/%s", name, mu_umaxtostr (0, info.cur));
+      p = mh_safe_make_file_name (name, mu_umaxtostr (0, info.cur));
       if (stat (p, &st) < 0 || !S_ISREG (st.st_mode))
        info.cur = 0;
       free (p);
diff --git a/mh/install-mh.c b/mh/install-mh.c
index 1363a65..4bf3cff 100644
--- a/mh/install-mh.c
+++ b/mh/install-mh.c
@@ -71,8 +71,7 @@ main (int argc, char **argv)
   home = mu_get_homedir ();
   if (!home)
     abort (); /* shouldn't happen */
-  asprintf (&name, "%s/%s", home, MH_USER_PROFILE);
-  
+  name = mh_safe_make_file_name (home, MH_USER_PROFILE);
   mh_install (name, automode);
   return 0;
 }
diff --git a/mh/mh.h b/mh/mh.h
index 4ebc589..ec78d01 100644
--- a/mh/mh.h
+++ b/mh/mh.h
@@ -368,3 +368,5 @@ int check_draft_disposition (struct mh_whatnow_env *wh, int 
use_draft);
 void ali_parse_error (const char *fmt, ...) MU_PRINTFLIKE(1,2); 
 void ali_verbatim (int enable);
 
+char *mh_safe_make_file_name (const char *dir, const char *file);
+  
diff --git a/mh/mh_global.c b/mh/mh_global.c
index 9578a8f..06b4417 100644
--- a/mh/mh_global.c
+++ b/mh/mh_global.c
@@ -61,7 +61,7 @@ mh_read_profile ()
       char *home = mu_get_homedir ();
       if (!home)
        abort (); /* shouldn't happen */
-      asprintf (&p, "%s/%s", home, MH_USER_PROFILE);
+      p = mh_safe_make_file_name (home, MH_USER_PROFILE);
       free (home);
     }
 
@@ -152,7 +152,7 @@ _mh_init_global_sequences ()
   _mh_init_global_context ();
   name = mh_global_profile_get ("mh-sequences", MH_SEQUENCES_FILE);
   p = mh_expand_name (NULL, current_folder, 0);
-  asprintf (&seq_name, "%s/%s", p, name);
+  seq_name = mh_safe_make_file_name (p, name);
   free (p);
   sequences = mh_context_create (seq_name, 1);
   if (mh_context_read (sequences) == 0)
diff --git a/mh/mh_init.c b/mh/mh_init.c
index b1c20c9..ca24686 100644
--- a/mh/mh_init.c
+++ b/mh/mh_init.c
@@ -381,14 +381,7 @@ mh_audit_open (char *name, mu_mailbox_t mbox)
   namep = mu_tilde_expansion (name, "/", NULL);
   if (strchr (namep, '/') == NULL)
     {
-      char *p = NULL;
-
-      asprintf (&p, "%s/%s", mu_folder_directory (), namep);
-      if (!p)
-       {
-         mu_error (_("not enough memory"));
-         exit (1);
-       }
+      char *p = mh_safe_make_file_name (mu_folder_directory (), namep);
       free (namep);
       namep = p;
     }
@@ -467,11 +460,16 @@ mh_get_dir ()
   if (mhdir[0] != '/')
     {
       char *p = mu_get_homedir ();
-      asprintf (&mhcopy, "%s/%s", p, mhdir);
+      mhcopy = mh_safe_make_file_name (p, mhdir);
       free (p);
     }
   else 
     mhcopy = strdup (mhdir);
+  if (!mhcopy)
+    {
+      mu_error (_("not enough memory"));
+      abort ();
+    }
   return mhcopy;
 }
 
@@ -487,8 +485,7 @@ mh_expand_name (const char *base, const char *name, int 
is_folder)
   else if (strncmp (namep, "../", 3) == 0 || strncmp (namep, "./", 2) == 0)
     {
       char *cwd = mu_getcwd ();
-      char *tmp = NULL;
-      asprintf (&tmp, "%s/%s", cwd, namep);
+      char *tmp = mh_safe_make_file_name (cwd, namep);
       free (cwd);
       free (namep);
       namep = tmp;
@@ -698,7 +695,7 @@ mh_real_install (char *name, int automode)
   char *ctx;
   FILE *fp;
   
-  asprintf (&mhdir, "%s/%s", home, "Mail");
+  mhdir = mh_safe_make_file_name (home, "Mail");
   
   if (!automode)
     {
@@ -736,7 +733,7 @@ mh_real_install (char *name, int automode)
          free (mhdir);
          if (local)
            {
-             asprintf (&mhdir, "%s/%s", home, p);
+              mhdir = mh_safe_make_file_name (home, p);
              free (p);
            }
          else
@@ -756,7 +753,7 @@ mh_real_install (char *name, int automode)
   fprintf (fp, "Path: %s\n", mhdir);
   fclose (fp);
 
-  asprintf (&ctx, "%s/%s", mhdir, MH_CONTEXT_FILE);
+  ctx = mh_safe_make_file_name (mhdir, MH_CONTEXT_FILE);
   fp = fopen (ctx, "w");
   if (fp)
     {
@@ -764,7 +761,7 @@ mh_real_install (char *name, int automode)
       fclose (fp);
     }
   free (ctx);
-  asprintf (&ctx, "%s/inbox", mhdir);
+  ctx = mh_safe_make_file_name (mhdir, "inbox");
   if (mh_check_folder (ctx, !automode))
     exit (1);
   free (ctx);
@@ -1029,3 +1026,17 @@ mh_draft_message (const char *name, const char *msgspec, 
char **pname)
   mu_mailbox_destroy (&mbox);
   return rc;
 }
+
+char *
+mh_safe_make_file_name (const char *dir, const char *file)
+{
+  file = mu_make_file_name (dir, file);
+  if (!file)
+    {
+      mu_diag_funcall (MU_DIAG_ERROR, "mu_make_file_name", NULL, ENOMEM);
+      abort ();
+    }
+  return file;
+}
+
+                         
diff --git a/mh/mhn.c b/mh/mhn.c
index 23c8872..2f95838 100644
--- a/mh/mhn.c
+++ b/mh/mhn.c
@@ -1487,10 +1487,7 @@ normalize_path (const char *cwd, char *path)
   if (!cwd)
     cwd = pcwd = mu_getcwd ();
 
-  len = strlen (cwd) + strlen (path) + 2;
-  p = xmalloc (len);
-  sprintf (p, "%s/%s", cwd, path);
-  path = p;
+  path = mh_safe_make_file_name (cwd, path);
 
   /* delete trailing delimiter if any */
   if (len && path[len-1] == '/')
@@ -1576,7 +1573,7 @@ store_handler (mu_message_t msg, msg_part_t part, char 
*type, char *encoding,
     {
       char *fname = mhn_store_command (msg, part, prefix);
       if (dir)
-       asprintf (&name, "%s/%s", dir, fname);
+       name = mh_safe_make_file_name (dir, fname);
       else
        name = fname;
     }
@@ -2670,7 +2667,7 @@ main (int argc, char **argv)
     case mode_compose:
       /* Prepare filename for diagnostic purposes */
       if (input_file[0] != '/')
-       asprintf (&input_file, "%s/%s", mu_folder_directory (), input_file);
+       input_file = mh_safe_make_file_name (mu_folder_directory (), 
input_file);
       rc = mhn_compose ();
       break;
       
diff --git a/mh/repl.c b/mh/repl.c
index 5bfccba..920c4d6 100644
--- a/mh/repl.c
+++ b/mh/repl.c
@@ -372,8 +372,8 @@ make_draft (mu_mailbox_t mbox, int disp, struct 
mh_whatnow_env *wh)
     
     mu_mailbox_get_url (mbox, &url);
     mh_message_number (msg, &num);
-    asprintf (&msgname, "%s/%s",
-             mu_url_to_string (url), mu_umaxtostr (0, num));
+    msgname = mh_safe_make_file_name (mu_url_to_string (url), 
+                                      mu_umaxtostr (0, num));
     p = strchr (msgname, ':');
     if (!p)
       wh->msg = msgname;
diff --git a/mh/rmf.c b/mh/rmf.c
index 469f770..8a2c60a 100644
--- a/mh/rmf.c
+++ b/mh/rmf.c
@@ -131,7 +131,7 @@ rmf (const char *name)
          || strcmp (entry->d_name, "..") == 0)
        continue;
       
-      asprintf (&p, "%s/%s", name, entry->d_name);
+      p = mh_safe_make_file_name (name, entry->d_name);
       if (stat (p, &st) < 0)
        {
          mu_diag_funcall (MU_DIAG_ERROR, "stat", p, errno);
diff --git a/mh/sortm.c b/mh/sortm.c
index fd40de6..1e5bacc 100644
--- a/mh/sortm.c
+++ b/mh/sortm.c
@@ -447,8 +447,8 @@ swap_message (size_t a, size_t b)
   char *path_a, *path_b;
   char *tmp;
   
-  asprintf (&path_a, "%s/%s", mbox_path, mu_umaxtostr (0, a));
-  asprintf (&path_b, "%s/%s", mbox_path, mu_umaxtostr (1, b));
+  path_a = mh_safe_make_file_name (mbox_path, mu_umaxtostr (0, a));
+  path_b = mh_safe_make_file_name (mbox_path, mu_umaxtostr (1, b));
   tmp = mu_tempname (mbox_path);
   rename (path_a, tmp);
   unlink (path_a);
diff --git a/mimeview/mimetypes.l b/mimeview/mimetypes.l
index a4dbf20..222f9bf 100644
--- a/mimeview/mimetypes.l
+++ b/mimeview/mimetypes.l
@@ -153,7 +153,7 @@ mimetypes_open (const char *name)
   
   if (S_ISDIR (st.st_mode))
     {
-      asprintf (&file_name, "%s/mime.types", name);
+      file_name = mu_make_file_name (name, "mime.types");
       file_name_alloc = 1;
     }
   else


hooks/post-receive
-- 
GNU Mailutils



reply via email to

[Prev in Thread] Current Thread [Next in Thread]