From: Dan Nelson Date: Sat, 3 May 2003 20:07:40 +0000 (+0000) Subject: Fix #1558. (mutt_expand_fmt rewrite; OPT_MAX wasn't maximal.) X-Git-Tag: pre-type-punning-patch~83 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4406e459c8d79fae955b987317b2e2eae28535e8;p=mutt Fix #1558. (mutt_expand_fmt rewrite; OPT_MAX wasn't maximal.) --- diff --git a/mutt.h b/mutt.h index 6494f39c..8e1f2dd4 100644 --- a/mutt.h +++ b/mutt.h @@ -261,35 +261,34 @@ enum /* quad-option vars */ enum { - - OPT_VERIFYSIG, /* verify PGP signatures */ - OPT_PGPTRADITIONAL, /* create old-style PGP messages */ - -#ifdef USE_SSL - OPT_SSLSTARTTLS, -#endif - - OPT_PRINT, - OPT_INCLUDE, + OPT_ABORT, + OPT_BOUNCE, + OPT_COPY, OPT_DELETE, + OPT_FORWEDIT, + OPT_INCLUDE, OPT_MFUPTO, OPT_MIMEFWD, + OPT_MIMEFWDREST, OPT_MOVE, - OPT_COPY, + OPT_PGPTRADITIONAL, /* create old-style PGP messages */ #ifdef USE_POP OPT_POPDELETE, OPT_POPRECONNECT, #endif OPT_POSTPONE, + OPT_PRINT, OPT_QUIT, OPT_REPLYTO, - OPT_ABORT, OPT_RECALL, +#ifdef USE_SSL + OPT_SSLSTARTTLS, +#endif OPT_SUBJECT, - OPT_MIMEFWDREST, - OPT_FORWEDIT, - OPT_MAX, - OPT_BOUNCE + OPT_VERIFYSIG, /* verify PGP signatures */ + + /* THIS MUST BE THE LAST VALUE. */ + OPT_MAX }; /* flags to ci_send_message() */ diff --git a/muttlib.c b/muttlib.c index fd2e8f00..1e902dec 100644 --- a/muttlib.c +++ b/muttlib.c @@ -766,59 +766,51 @@ void mutt_expand_file_fmt (char *dest, size_t destlen, const char *fmt, const ch void mutt_expand_fmt (char *dest, size_t destlen, const char *fmt, const char *src) { - const char *p = fmt; - const char *last = p; - size_t len; + const char *p; + char *d; size_t slen; int found = 0; slen = mutt_strlen (src); + destlen--; - while ((p = strchr (p, '%')) != NULL) + for (p = fmt, d = dest; destlen && *p; p++) { - if (p[1] == 's') + if (*p == '%') { - found++; - - len = (size_t) (p - last); - if (len) + switch (p[1]) { - if (len > destlen - 1) - len = destlen - 1; - - memcpy (dest, last, len); - dest += len; - destlen -= len; - - if (destlen <= 0) - { - *dest = 0; - break; /* no more space */ - } - } - - strfcpy (dest, src, destlen); - if (slen > destlen) - { - /* no more room */ - break; + case '%': + *d++ = *p++; + destlen--; + break; + case 's': + found = 1; + strfcpy (d, src, destlen + 1); + d += destlen > slen ? slen : destlen; + destlen -= destlen > slen ? slen : destlen; + p++; + break; + default: + *d++ = *p; + destlen--; + break; } - dest += slen; - destlen -= slen; - - p += 2; - last = p; } - else if (p[1] == '%') - p++; - - p++; + else + { + *d++ = *p; + destlen--; + } + } + + *d = '\0'; + + if (!found && destlen > 0) + { + strncat (dest, " ", destlen); + strncat (dest, src, destlen-1); } - - if (found) - strfcpy (dest, last, destlen); - else - snprintf (dest, destlen, "%s %s", fmt, src); }