From: Ken Hornstein Date: Wed, 5 Mar 2014 04:43:26 +0000 (-0500) Subject: Fix up some error reporting, and reassemble partial parameters correctly. X-Git-Url: https://diplodocus.org/git/nmh/commitdiff_plain/91c1ac91d1b87f4b9771ac4d91d36952f40fc1df?hp=64de90c03d49e3484f0e00818f9d8559a1292065 Fix up some error reporting, and reassemble partial parameters correctly. --- diff --git a/uip/mhparse.c b/uip/mhparse.c index 9cd38f99..754b9a2f 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -3255,6 +3255,7 @@ parse_header_attrs (const char *filename, const char *fieldname, struct sectlist { char *value; int index; + int len; struct sectlist *next; } *sp, *sp2; struct parmlist { @@ -3263,11 +3264,11 @@ parse_header_attrs (const char *filename, const char *fieldname, char *lang; struct sectlist *sechead; struct parmlist *next; - } *pp, *phead = NULL; + } *pp, *pp2, *phead = NULL; while (*cp == ';') { char *dp, *vp, *up, *nameptr, *valptr, *charset = NULL, *lang = NULL; - int encoded = 0, partial = 0, index = 0, len = 0; + int encoded = 0, partial = 0, len = 0, index = 0; cp++; while (isspace ((unsigned char) *cp)) @@ -3542,6 +3543,7 @@ bad_quote: memset(sp, 0, sizeof(*sp)); sp->value = valptr; sp->index = index; + sp->len = len; if (pp->sechead == NULL || pp->sechead->index > index) { sp->next = pp->sechead; @@ -3556,7 +3558,7 @@ bad_quote: return NOTOK; } if (sp2->index < sp->index && - (sp2->next == NULL || sp2->next->index < sp->index)) { + (sp2->next == NULL || sp2->next->index > sp->index)) { sp->next = sp2->next; sp2->next = sp; break; @@ -3565,7 +3567,7 @@ bad_quote: if (sp2 == NULL) { advise(NULL, "Internal error: cannot insert partial " - "param in message %s's %s: field\n*s(parameter %s)", + "param in message %s's %s: field\n%*s(parameter %s)", filename, fieldname, strlen(invo_name) + 2, "", nameptr); return NOTOK; @@ -3601,6 +3603,47 @@ bad_quote: } } + /* + * Now that we're done, reassemble all of the partial parameters. + */ + + for (pp = phead; pp != NULL; ) { + char *p, *q; + size_t tlen = 0; + int pindex = 0; + for (sp = pp->sechead; sp != NULL; sp = sp->next) { + if (sp->index != pindex++) { + advise(NULL, "missing section %d for parameter in " + "message %s's %s: field\n%*s(parameter %s)", pindex - 1, + filename, fieldname, strlen(invo_name) + 2, "", + pp->name); + return NOTOK; + } + tlen += sp->len; + } + + p = q = mh_xmalloc(tlen + 1); + for (sp = pp->sechead; sp != NULL; ) { + memcpy(q, sp->value, sp->len); + q += sp->len; + free(sp->value); + sp2 = sp->next; + free(sp); + sp = sp2; + } + + p[tlen] = '\0'; + + pm = add_param(param_head, param_tail, pp->name, p); + pm->pm_charset = pp->charset; + pm->pm_lang = pp->lang; + free(pp->name); + free(p); + pp2 = pp->next; + free(pp); + pp = pp2; + } + *header_attrp = cp; return OK; }