From: Thomas Roessler Date: Thu, 27 Aug 1998 09:51:21 +0000 (+0000) Subject: [patch-0.94.4i.tlr.shell_quote.1] Try to quote file name X-Git-Tag: mutt-0-94-5i-rel~21 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ded841840b473842a49f4f3627f488ca323d05b1;p=mutt [patch-0.94.4i.tlr.shell_quote.1] Try to quote file name arguments and the like for shell commands. --- diff --git a/curs_lib.c b/curs_lib.c index fa7feb19..f324e40a 100644 --- a/curs_lib.c +++ b/curs_lib.c @@ -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 2134c5a9..c5bb3e39 100644 --- 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 aaf1c45a..ce611617 100644 --- 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); } diff --git a/pgpinvoke.c b/pgpinvoke.c index d210eb0b..10126827 100644 --- a/pgpinvoke.c +++ b/pgpinvoke.c @@ -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); diff --git a/protos.h b/protos.h index 808b009d..0b6c1496 100644 --- 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 *); diff --git a/rfc1524.c b/rfc1524.c index d35a0ad1..04ac24cd 100644 --- 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')