X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/dbdc79c387af1820ee5f4bf669b337becde83357..6ce8434dcf6ff95db7bc75a97fd1144e54206dfe:/uip/mhlsbr.c diff --git a/uip/mhlsbr.c b/uip/mhlsbr.c index 421098cb..2c241714 100644 --- a/uip/mhlsbr.c +++ b/uip/mhlsbr.c @@ -895,6 +895,7 @@ process (char *folder, char *fname, int ofilen, int ofilec) FILE *fp = NULL; struct mcomp *c1; struct stat st; + struct arglist *ap; switch (setjmp (env)) { case OK: @@ -919,6 +920,14 @@ process (char *folder, char *fname, int ofilen, int ofilec) SIGNAL (SIGINT, intrser); mhlfile (fp, cp, ofilen, ofilec); /* FALL THROUGH! */ + for (ap = arglist_head; ap; ap = ap->a_next) { + fmt_free(ap->a_fmt, 0); + ap->a_fmt = NULL; + } + + if (arglist_head) + fmt_free(NULL, 1); + default: if (ontty != PITTY) SIGNAL (SIGINT, SIG_IGN); @@ -1006,14 +1015,16 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec) } for (state = FLD;;) { - switch (state = m_getfld (state, name, buf, sizeof(buf), fp)) { + int bufsz = sizeof buf; + switch (state = m_getfld (state, name, buf, &bufsz, fp)) { case FLD: case FLDPLUS: - bucket = fmt_addcomp(name, buf); + bucket = fmt_addcomptext(name, buf); for (ip = ignores; *ip; ip++) if (!mh_strcasecmp (name, *ip)) { while (state == FLDPLUS) { - state = m_getfld (state, name, buf, sizeof(buf), fp); + bufsz = sizeof buf; + state = m_getfld (state, name, buf, &bufsz, fp); fmt_appendcomp(bucket, name, buf); } break; @@ -1035,7 +1046,8 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec) if (c1 == NULL) c1 = add_queue (&msghd, &msgtl, name, buf, 0); while (state == FLDPLUS) { - state = m_getfld (state, name, buf, sizeof(buf), fp); + bufsz = sizeof buf; + state = m_getfld (state, name, buf, &bufsz, fp); c1->c_text = add (buf, c1->c_text); fmt_appendcomp(bucket, name, buf); } @@ -1074,8 +1086,9 @@ mhlfile (FILE *fp, char *mname, int ofilen, int ofilec) strncpy (holder.c_text, buf, sizeof(buf)); while (state == BODY) { putcomp (c1, &holder, BODYCOMP); + bufsz = sizeof buf; state = m_getfld (state, name, holder.c_text, - sizeof(buf), fp); + &bufsz, fp); } free (holder.c_text); holder.c_text = NULL; @@ -1159,7 +1172,7 @@ mcomp_format (struct mcomp *c1, struct mcomp *c2) if (!(c1->c_flags & ADDRFMT)) { if (c1->c_c_text) - c1->c_c_text->c_text = getcpy (ap); + c1->c_c_text->c_text = ap; if ((cp = strrchr(ap, '\n'))) /* drop ending newline */ if (!cp[1]) *cp = 0; @@ -1168,7 +1181,7 @@ mcomp_format (struct mcomp *c1, struct mcomp *c2) /* Don't need to append a newline, dctime() already did */ c2->c_text = getcpy (buffer); - free (ap); + /* ap is now owned by the component struct, so do NOT free it here */ return; } @@ -1566,6 +1579,7 @@ mhlsbr (int argc, char **argv, FILE *(*action)()) SIGNAL_HANDLER istat = NULL, pstat = NULL, qstat = NULL; char *cp = NULL; struct mcomp *c1; + struct arglist *a, *a2; switch (setjmp (mhlenv)) { case OK: @@ -1602,6 +1616,15 @@ mhlsbr (int argc, char **argv, FILE *(*action)()) free_queue (&msghd, &msgtl); for (c1 = fmthd; c1; c1 = c1->c_next) c1->c_flags &= ~HDROUTPUT; + + a = arglist_head; + while (a) { + if (a->a_nfs) + free(a->a_nfs); + a2 = a->a_next; + free(a); + a = a2; + } return exitstat; } } @@ -1819,8 +1842,9 @@ filterbody (struct mcomp *c1, char *buf, int bufsz, int state, FILE *fp) */ while (state == BODY) { + int bufsz2 = bufsz; write(fdinput[1], buf, strlen(buf)); - state = m_getfld(state, name, buf, bufsz, fp); + state = m_getfld(state, name, buf, &bufsz2, fp); } /*