]> granicus.if.org Git - neomutt/commitdiff
[patch-0.94.4i.tlr.shell_quote.1] Try to quote file name
authorThomas Roessler <roessler@does-not-exist.org>
Thu, 27 Aug 1998 09:51:21 +0000 (09:51 +0000)
committerThomas Roessler <roessler@does-not-exist.org>
Thu, 27 Aug 1998 09:51:21 +0000 (09:51 +0000)
arguments and the like for shell commands.

curs_lib.c
lib.c
mx.c
pgpinvoke.c
protos.h
rfc1524.c

index fa7feb19c5ab73bae4662ccf130778039f3860bb..f324e40a77c22fb1086389fb85604eb2c5a7fb96 100644 (file)
@@ -113,7 +113,7 @@ void mutt_clear_error (void)
 void mutt_edit_file (const char *editor, const char *data)
 {
   char cmd[LONG_STRING];
-
+  
   endwin ();
   mutt_expand_fmt (cmd, sizeof (cmd), editor, data);
   mutt_system (cmd);
@@ -271,7 +271,7 @@ int mutt_do_pager (const char *banner,
                   pager_t *info)
 {
   int rc;
-
+  
   if (!Pager || strcmp (Pager, "builtin") == 0)
     rc = mutt_pager (banner, tempfile, do_color, info, "");
   else
@@ -279,7 +279,7 @@ int mutt_do_pager (const char *banner,
     char cmd[STRING];
     
     endwin ();
-    snprintf (cmd, sizeof (cmd), "%s %s", NONULL(Pager), tempfile);
+    mutt_expand_fmt (cmd, sizeof(cmd), Pager, tempfile);
     mutt_system (cmd);
     mutt_unlink (tempfile);
     rc = 0;
diff --git a/lib.c b/lib.c
index 2134c5a9e892225325e4435ab36f7a0f1498683e..c5bb3e39213c0f0945b0f7b9bdbebe096fadebb0 100644 (file)
--- a/lib.c
+++ b/lib.c
@@ -595,9 +595,18 @@ void mutt_expand_fmt (char *dest, size_t destlen, const char *fmt, const char *s
   const char *p = fmt;
   const char *last = p;
   size_t len;
-  size_t slen = strlen (src);
+  char *_src;
+  size_t slen;
   int found = 0;
 
+  /* some rationale should be given here: mutt's quoting
+   * rules are similar enough to the shell's rules so we
+   * can use mutt_quote_filename() even for patterns.
+   */
+
+  _src = mutt_quote_filename(src);
+  slen = strlen (_src);
+  
   while ((p = strchr (p, '%')) != NULL)
   {
     if (p[1] == 's')
@@ -642,7 +651,9 @@ void mutt_expand_fmt (char *dest, size_t destlen, const char *fmt, const char *s
   if (found)
     strfcpy (dest, last, destlen);
   else
-    snprintf (dest, destlen, "%s '%s'", fmt, src);
+    snprintf (dest, destlen, "%s %s", fmt, _src);
+  
+  FREE(&_src);
 }
 
 int safe_open (const char *path, int flags)
@@ -1129,3 +1140,44 @@ int mutt_save_confirm (const char *s, struct stat *st)
   CLEARLINE (LINES-1);
   return (ret);
 }
+
+/* prepare a file name to survive the shell's quoting rules.
+ * From the Unix programming FAQ by way of Liviu.
+ */
+
+char *mutt_quote_filename(const char *f)
+{
+  char *d;
+  size_t i,l;
+
+  if(!f) return NULL;
+  
+  for(i = 0, l = 3; f[i]; i++, l++)
+  {
+    if(f[i] == '\'')
+      l += 3;
+  }
+  
+  d = safe_malloc(l);
+  
+  l = 0;
+  d[l++] = '\'';
+  
+  for(i = 0; f[i]; i++)
+  {
+    if(f[i] == '\'')
+    {
+      d[l++] = '\'';
+      d[l++] = '\\';
+      d[l++] = '\'';
+      d[l++] = '\'';
+    }
+    else
+      d[l++] = f[i];
+  }
+  
+  d[l++] = '\'';
+  d[l]   = '\0';
+  
+  return d;
+}
diff --git a/mx.c b/mx.c
index aaf1c45a9838e39cd2751f69218d2a6b2b7e4a6f..ce611617ed3e9ad8c1a73d7a92d1de9fd215a797 100644 (file)
--- a/mx.c
+++ b/mx.c
@@ -73,10 +73,13 @@ static int invoke_dotlock(const char *path, int flags, int retry)
 {
   char cmd[LONG_STRING + _POSIX_PATH_MAX];
   char r[SHORT_STRING];
+  char *f;
   
   if(flags & DL_FL_RETRY)
     snprintf(r, sizeof(r), "-r %d ", retry ? MAXLOCKATTEMPT : 0);
   
+  f = mutt_quote_filename(path);
+  
   snprintf(cmd, sizeof(cmd),
           "%s %s%s%s%s%s%s",
           DOTLOCK,
@@ -85,7 +88,9 @@ static int invoke_dotlock(const char *path, int flags, int retry)
           flags & DL_FL_USEPRIV ? "-p " : "",
           flags & DL_FL_FORCE ? "-f " : "",
           flags & DL_FL_RETRY ? r : "",
-          path);
+          f);
+  
+  FREE(&f);
 
   return mutt_system(cmd);
 }
index d210eb0b669e983c921e19c7ee435cb0db24d379..101268272b9b0a9882b54a84118e58b642d0ee32 100644 (file)
@@ -38,13 +38,20 @@ pid_t pgp_v2_invoke_decode(struct pgp_vinfo *pgp,
                           const char *fname, int need_passphrase)
 {
   char cmd[HUGE_STRING];
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
   
   snprintf(cmd, sizeof(cmd), "%scat %s%s | "
           "%s +language=%s +pubring=%s +secring=%s +verbose=0 +batchmode -f",
           need_passphrase ? "PGPPASSFD=0; export PGPPASSFD; " : "",
           need_passphrase ? "- " : "",
-          fname,
-          NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring));
+          _fname,
+          NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring));
+
+  FREE(&pubring); FREE(&secring); FREE(&binary); 
+  FREE(&_fname);
   
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
@@ -57,11 +64,19 @@ pid_t pgp_v2_invoke_verify(struct pgp_vinfo *pgp,
                           const char *signedstuff, const char *sigfile)
 {
   char cmd[HUGE_STRING];
-
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_signed = mutt_quote_filename(signedstuff);
+  char *_sig    = mutt_quote_filename(sigfile);
+  
   snprintf(cmd, sizeof(cmd), 
           "%s +language=%s +pubring=%s +secring=%s +batchmode +verbose=0 %s %s",
-          NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), sigfile, signedstuff);
+          NONULL (binary), NONULL (*pgp->language), NONULL (pubring), 
+          NONULL (secring), _sig, _signed);
 
+  FREE(&pubring); FREE(&secring); FREE(&binary);
+  FREE(&_signed); FREE(&_sig);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -73,12 +88,17 @@ pid_t pgp_v2_invoke_decrypt(struct pgp_vinfo *pgp,
                            const char *fname)
 {
   char cmd[HUGE_STRING];
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
 
   snprintf(cmd, sizeof(cmd),
           "PGPPASSFD=0; export PGPPASSFD; cat - %s | %s +language=%s +pubring=%s +secring=%s "
           "+verbose=0 +batchmode -f",
-          fname, NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring));
-
+          _fname, NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring));
+  FREE(&pubring); FREE(&secring); FREE(&binary);
+  FREE(&_fname);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                            pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -92,14 +112,20 @@ pid_t pgp_v2_invoke_sign(struct pgp_vinfo *pgp,
                         const char *fname)
 {
   char cmd[HUGE_STRING];
-
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
+  
   snprintf(cmd, sizeof(cmd),
           "PGPPASSFD=0; export PGPPASSFD; cat - %s | %s "
           "+language=%s +pubring=%s +secring=%s +verbose=0 +batchmode -abfst %s %s",
-          fname, NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), 
+          _fname, NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), 
           PgpSignAs ? "-u" : "",
           PgpSignAs ? PgpSignAs : "");
-
+  
+  FREE(&pubring); FREE(&secring); FREE(&binary);
+  FREE(&_fname);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -112,19 +138,24 @@ pid_t pgp_v2_invoke_encrypt(struct pgp_vinfo *pgp,
                            const char *fname, const char *uids, int sign)
 {
   char cmd[HUGE_STRING];
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
   
   snprintf(cmd, sizeof(cmd),
           "%scat %s%s | %s +language=%s +pubring=%s +secring=%s +verbose=0 %s +batchmode -aeft%s %s%s %s",
           sign ? "PGPPASSFD=0; export PGPPASSFD; " : "",
           sign ? "- " : "",
-          fname,
-          NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), 
+          _fname,
+          NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), 
           option(OPTPGPENCRYPTSELF) ? "+encrypttoself" : "",
           sign ? "s" : "",
           sign && PgpSignAs ? "-u " : "",
           sign && PgpSignAs ? PgpSignAs : "",
           uids);
-  
+  FREE(&pubring); FREE(&secring); FREE(&binary);
+  FREE(&_fname);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, 
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -132,9 +163,16 @@ pid_t pgp_v2_invoke_encrypt(struct pgp_vinfo *pgp,
 void pgp_v2_invoke_import(struct pgp_vinfo *pgp, const char *fname)
 {
   char cmd[HUGE_STRING];
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
   
   snprintf(cmd, sizeof(cmd), "%s +language=%s +pubring=%s +secring=%s -ka %s",
-          NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), fname);
+          NONULL (binary), NONULL (*pgp->language), NONULL (pubring), 
+          NONULL (secring), _fname);
+  FREE(&pubring); FREE(&secring); FREE(&binary);
+  FREE(&_fname);
   mutt_system(cmd);
 }
 
@@ -143,10 +181,13 @@ pid_t pgp_v2_invoke_export(struct pgp_vinfo *pgp,
                           int pgpinfd, int pgpoutfd, int pgperrfd, const char *id)
 {
   char cmd[HUGE_STRING];
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
 
   snprintf(cmd, sizeof(cmd), "%s -kxaf +language=%s +pubring=%s +secring=%s 0x%8s",
-          NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), id);
-
+          NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), id);
+  FREE(&pubring); FREE(&secring); FREE(&binary);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -157,9 +198,13 @@ pid_t pgp_v2_invoke_verify_key(struct pgp_vinfo *pgp,
                               int pgpinfd, int pgpoutfd, int pgperrfd, const char *id)
 {
   char cmd[HUGE_STRING];
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
 
   snprintf(cmd, sizeof(cmd), "%s +language=%s +pubring=%s +secring=%s +batchmode -kcc 0x%8s",
-          NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), id);
+          NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), id);
+  FREE(&pubring); FREE(&secring); FREE(&binary);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -178,15 +223,19 @@ pid_t pgp_v3_invoke_decode(struct pgp_vinfo *pgp,
                           const char *fname, int need_passphrase)
 {
   char cmd[HUGE_STRING];
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
   
   snprintf(cmd, sizeof(cmd), "%scat %s%s | "
           "%sv +language=%s +pubring=%s +secring=%s +verbose=0 +batchmode -f "
           "--OutputInformationFD=2",
           need_passphrase ? "PGPPASSFD=0; export PGPPASSFD; " : "",
           need_passphrase ? "- " : "",
-          fname,
-          NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring));
-  
+          _fname,
+          NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring));
+  FREE(&pubring); FREE(&secring); FREE(&binary); FREE(&_fname);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -198,11 +247,19 @@ pid_t pgp_v3_invoke_verify(struct pgp_vinfo *pgp,
                           const char *signedstuff, const char *sigfile)
 {
   char cmd[HUGE_STRING];
-
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_sign   = mutt_quote_filename(signedstuff);
+  char *_sig    = mutt_quote_filename(sigfile);
+  
   snprintf(cmd, sizeof(cmd),
           "%sv +language=%s +pubring=%s +secring=%s --OutputInformationFD=1 +batchmode +verbose=0 %s %s",
-          NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), sigfile, signedstuff);
+          NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), 
+          _sig, _sign);
   
+  FREE(&pubring); FREE(&secring); FREE(&binary);
+  FREE(&_sign); FREE(&_sig);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -216,18 +273,24 @@ pid_t pgp_v3_invoke_encrypt(struct pgp_vinfo *pgp,
   char tmpcmd[HUGE_STRING];
   char *cp;
   char *keylist;
-
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
+  
   snprintf(cmd, sizeof(cmd),
           "%scat %s%s | %se +language=%s +pubring=%s +secring=%s +verbose=0 %s +batchmode +nobatchinvalidkeys=off -aft%s %s%s",
           sign ? "PGPPASSFD=0; export PGPPASSFD; " : "",
           sign ? "- " : "",
-          fname,
-          NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), 
+          _fname,
+          NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), 
           option(OPTPGPENCRYPTSELF) ? "+encrypttoself" : "",
           sign ? "s" : "",
           sign && PgpSignAs ? "-u " : "",
           sign && PgpSignAs ? PgpSignAs : "");
   
+  FREE(&pubring); FREE(&secring); FREE(&binary); FREE(&_fname);
+  
   keylist = safe_strdup(uids);
   
   for(cp = strtok(keylist, " "); cp ; cp = strtok(NULL, " "))
@@ -248,12 +311,17 @@ pid_t pgp_v3_invoke_decrypt(struct pgp_vinfo *pgp,
                            const char *fname)
 {
   char cmd[HUGE_STRING];
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
   
   snprintf(cmd, sizeof(cmd),
           "PGPPASSFD=0; export PGPPASSFD; cat - %s | %sv +language=%s +pubring=%s +secring=%s "
           "+verbose=0 +batchmode -f --OutputInformationFD=2",
-          fname, NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring));
-  
+          _fname, NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring));
+
+  FREE(&pubring); FREE(&secring); FREE(&binary); FREE(&_fname);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -265,23 +333,32 @@ pid_t pgp_v3_invoke_sign(struct pgp_vinfo *pgp,
                         const char *fname)
 {
   char cmd[HUGE_STRING];
-
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
+  
   snprintf(cmd, sizeof(cmd),
           "PGPPASSFD=0; export PGPPASSFD; cat - %s | %ss "
           "+language=%s +pubring=%s +secring=%s +verbose=0 -abft %s %s",
-          fname, NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring),
+          _fname, NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring),
           PgpSignAs ? "-u" : "",
           PgpSignAs ? PgpSignAs : "");
-
+  FREE(&pubring); FREE(&secring); FREE(&binary); FREE(&_fname);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
 void pgp_v3_invoke_import(struct pgp_vinfo *pgp, const char *fname)
 {
   char cmd[HUGE_STRING];
-
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
+  
   snprintf(cmd, sizeof(cmd), "%sk +language=%s +pubring=%s +secring=%s -a --OutputInformationFD=1 %s",
-          NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), fname);
+          NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), _fname);
+  FREE(&pubring); FREE(&secring); FREE(&binary); FREE(&_fname);
   mutt_system(cmd);
 }
 
@@ -291,10 +368,14 @@ pid_t pgp_v3_invoke_export(struct pgp_vinfo *pgp,
                           int pgpinfd, int pgpoutfd, int pgperrfd, const char *id)
 {
   char cmd[HUGE_STRING];
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
 
   snprintf(cmd, sizeof(cmd), "%sk -xa +language=%s +pubring=%s +secring=%s --OutputInformationFD=1 0x%8s",
-          NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), id);
-
+          NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), id);
+  
+  FREE(&pubring); FREE(&secring); FREE(&binary);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -304,10 +385,14 @@ pid_t pgp_v3_invoke_verify_key(struct pgp_vinfo *pgp,
                               int pgpinfd, int pgpoutfd, int pgperrfd, const char *id)
 {
   char cmd[HUGE_STRING];
+  char *pubring = mutt_quote_filename(*pgp->pubring);
+  char *secring = mutt_quote_filename(*pgp->secring); 
+  char *binary  = mutt_quote_filename(*pgp->binary);
 
   snprintf(cmd, sizeof(cmd), "%sk +language=%s +pubring=%s +secring=%s +batchmode -c --OutputInformationFD=1 0x%8s",
-          NONULL (*pgp->binary), NONULL (*pgp->language), NONULL (*pgp->pubring), NONULL (*pgp->secring), id);
-  
+          NONULL (binary), NONULL (*pgp->language), NONULL (pubring), NONULL (secring), id);
+
+  FREE(&pubring); FREE(&secring); FREE(&binary);  
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -328,12 +413,15 @@ pid_t pgp_gpg_invoke_decode(struct pgp_vinfo *pgp,
                            const char *fname, int need_passphrase)
 {
   char cmd[HUGE_STRING];
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
   
   snprintf(cmd, sizeof(cmd),
           "%s%s --no-verbose --batch --status-fd 2 -o - %s",
-          NONULL(*pgp->binary), need_passphrase? " --passphrase-fd 0":"",
-          fname);
-  
+          NONULL(binary), need_passphrase? " --passphrase-fd 0":"",
+          _fname);
+
+  FREE(&binary); FREE(&_fname);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -344,12 +432,17 @@ pid_t pgp_gpg_invoke_verify(struct pgp_vinfo *pgp,
                            const char *signedstuff, const char *sigfile)
 {  
   char cmd[HUGE_STRING];
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_sign   = mutt_quote_filename(signedstuff);
+  char *_sig   = mutt_quote_filename(sigfile);
   
   snprintf(cmd, sizeof(cmd),
           "%s --no-verbose --batch --status-fd 2 -o - "
           "--verify %s %s",
-          NONULL(*pgp->binary), sigfile, signedstuff);
-  
+          NONULL(binary), _sig, _sign);
+
+  FREE(&binary); FREE(&_sign); FREE(&_sig);
+
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -360,12 +453,16 @@ pid_t pgp_gpg_invoke_decrypt(struct pgp_vinfo *pgp,
                            const char *fname)
 {
   char cmd[HUGE_STRING];
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
   
   snprintf(cmd, sizeof(cmd),
           "%s --passphrase-fd 0 --no-verbose --batch --status-fd 2 -o - "
           "--decrypt %s",
-          NONULL(*pgp->binary), fname );
-  
+          NONULL(binary), _fname);
+
+  FREE(&binary); FREE(&_fname);
+
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -393,17 +490,20 @@ pid_t pgp_gpg_invoke_sign(struct pgp_vinfo *pgp,
                         const char *fname)
 {
   char cmd[HUGE_STRING];
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
   
   snprintf(cmd, sizeof(cmd),
           "%s --no-verbose --batch --status-fd 2 -o - "
           "--passphrase-fd 0 --digest-algo %s "
           "--detach-sign --textmode --armor %s%s %s",
-          NONULL(*pgp->binary),
+          NONULL(binary),
           gpg_digalg(),
           PgpSignAs? "-u " : "",
-          PgpSignAs? PgpSignAs : "", fname );
+          PgpSignAs? PgpSignAs : "", _fname);
   
   
+  FREE(&binary); FREE(&_fname);
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -419,12 +519,14 @@ pid_t pgp_gpg_invoke_encrypt(struct pgp_vinfo *pgp,
   char tmpcmd[HUGE_STRING];
   char *cp;
   char *keylist;
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
   
   snprintf(cmd, sizeof(cmd),
           "%s%s --no-verbose -v --batch --status-fd 2 -o - "
           "--digest-algo %s "
           "--encrypt%s --textmode --armor --always-trust %s%s",
-          NONULL(*pgp->binary),
+          NONULL(binary),
           sign? " --passphrase-fd 0":"",
           gpg_digalg(),
           sign? " --sign":"",
@@ -432,7 +534,6 @@ pid_t pgp_gpg_invoke_encrypt(struct pgp_vinfo *pgp,
           PgpSignAs? PgpSignAs : "" );
   
   keylist = safe_strdup(uids);
-
   for(cp = strtok(keylist, " "); cp ; cp = strtok(NULL, " "))
   {
     snprintf(tmpcmd, sizeof(tmpcmd), "%s -r %s",
@@ -440,8 +541,11 @@ pid_t pgp_gpg_invoke_encrypt(struct pgp_vinfo *pgp,
     strcpy(cmd, tmpcmd);
   }
   safe_free((void **) &keylist);
-  snprintf(tmpcmd, sizeof(tmpcmd), "%s %s", cmd, fname);
+
+  snprintf(tmpcmd, sizeof(tmpcmd), "%s %s", cmd, _fname);
   strcpy(cmd, tmpcmd);
+
+  FREE(&binary); FREE(&_fname);
   
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr, 
                               pgpinfd, pgpoutfd, pgperrfd);
@@ -450,9 +554,15 @@ pid_t pgp_gpg_invoke_encrypt(struct pgp_vinfo *pgp,
 void pgp_gpg_invoke_import(struct pgp_vinfo *pgp, const char *fname)
 {
   char cmd[HUGE_STRING];
+  char *binary  = mutt_quote_filename(*pgp->binary);
+  char *_fname  = mutt_quote_filename(fname);
 
   snprintf(cmd, sizeof(cmd), "%sm --no-verbose --import -v %s",
-          NONULL (*pgp->binary), fname);
+          NONULL (binary), _fname);
+  
+  FREE(&binary);
+  FREE(&_fname);
+  
   mutt_system(cmd);
 }
 
@@ -461,10 +571,13 @@ pid_t pgp_gpg_invoke_export(struct pgp_vinfo *pgp,
                           int pgpinfd, int pgpoutfd, int pgperrfd, const char *id)
 {
   char cmd[HUGE_STRING];
+  char *binary  = mutt_quote_filename(*pgp->binary);
 
   snprintf(cmd, sizeof(cmd), "%sm --no-verbose --export --armor 0x%8s",
-          NONULL (*pgp->binary), id);
-
+          NONULL (binary), id);
+  
+  FREE(&binary);
+  
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
 }
@@ -475,10 +588,13 @@ pid_t pgp_gpg_invoke_verify_key(struct pgp_vinfo *pgp,
                               int pgpinfd, int pgpoutfd, int pgperrfd, const char *id)
 {
   char cmd[HUGE_STRING];
+  char *binary  = mutt_quote_filename(*pgp->binary);
 
   snprintf(cmd, sizeof(cmd),
           "%sm --no-verbose --batch --fingerprint --check-sigs %s%s",
-          NONULL(*pgp->binary), (strlen(id)==8 || strlen(id)==16)? "0x":"", id );
+          NONULL(binary), (strlen(id)==8 || strlen(id)==16)? "0x":"", id );
+  
+  FREE(&binary);
   
   return mutt_create_filter_fd(cmd, pgpin, pgpout, pgperr,
                               pgpinfd, pgpoutfd, pgperrfd);
index 808b009d51d5d23f7344649f51380da44e11e6c6..0b6c1496bc12bc41220341b6550b2f17edf7c51f 100644 (file)
--- a/protos.h
+++ b/protos.h
@@ -107,6 +107,7 @@ char *mutt_get_parameter (const char *, PARAMETER *);
 #ifdef _PGPPATH
 char *mutt_pgp_hook (ADDRESS *);
 #endif /* _PGPPATH */
+char *mutt_quote_filename(const char *);
 char *mutt_read_line (char *, size_t *, FILE *, int *);
 char *mutt_strlower (char *);
 char *mutt_skip_whitespace (char *);
index d35a0ad1093709d034b0ac03595c8e005b75975e..04ac24cd69265a47f810c06a54c680645b3907f7 100644 (file)
--- a/rfc1524.c
+++ b/rfc1524.c
@@ -83,10 +83,12 @@ int rfc1524_expand_command (BODY *a, char *filename, char *type,
       }
       else if (command[x] == 's' && filename != NULL)
       {
-       char *fn = filename;
+       char *fn = mutt_quote_filename(filename);
 
        while (*fn && y < sizeof (buf))
          buf[y++] = *fn++;
+       
+       FREE(&fn);
        needspipe = FALSE;
       }
       else if (command[x] == 't')