X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhparse.c;h=71c1e8e2933a9fbf00d35656c74fcd33fcd25d61;hp=af460e6a0df624ea9b5b3a1b6eae9a380834f6e5;hb=9cf6132a6ea29968131a000bc2fb6860affac45e;hpb=264f6e648f566f8efaa0188fb6a9e4908329d6d6 diff --git a/uip/mhparse.c b/uip/mhparse.c index af460e6..71c1e8e 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -8,14 +8,16 @@ #include #include -#include -#include -#include #include +#include #include #include #include #include +#include +#include +#include +#include extern int debugsw; @@ -137,7 +139,7 @@ pidcheck(int status) fflush(stdout); fflush(stderr); - done(1); + exit(EX_SOFTWARE); return 1; } @@ -164,7 +166,7 @@ parse_mime(char *file) advise("mhparse", "unable to create temporary file"); return NULL; } - file = getcpy(tfile); + file = mh_xstrdup(tfile); chmod(file, 0600); while (fgets(buffer, sizeof(buffer), stdin)) @@ -236,11 +238,10 @@ get_content(FILE *in, char *file, int toplevel) HF hp; /* allocate the content structure */ - if (!(ct = (CT) calloc(1, sizeof(*ct)))) - adios(NULL, "out of memory"); + ct = mh_xcalloc(1, sizeof(*ct)); ct->c_fp = in; - ct->c_file = getcpy(file); + ct->c_file = mh_xstrdup(file); ct->c_begin = ftell(ct->c_fp) + 1; /* @@ -251,12 +252,11 @@ get_content(FILE *in, char *file, int toplevel) switch (state = m_getfld(state, name, buf, sizeof(buf), in)) { case FLD: case FLDPLUS: - case FLDEOF: compnum++; /* get copies of the buffers */ - np = getcpy(name); - vp = getcpy(buf); + np = mh_xstrdup(name); + vp = mh_xstrdup(buf); /* if necessary, get rest of field */ while (state == FLDPLUS) { @@ -268,15 +268,10 @@ get_content(FILE *in, char *file, int toplevel) /* Now add the header data to the list */ add_header(ct, np, vp); - /* continue, if this isn't the last header field */ - if (state != FLDEOF) { - ct->c_begin = ftell(in) + 1; - continue; - } - /* else fall... */ + ct->c_begin = ftell(in) + 1; + continue; case BODY: - case BODYEOF: ct->c_begin = ftell(in) - strlen(buf); break; @@ -286,11 +281,11 @@ get_content(FILE *in, char *file, int toplevel) case LENERR: case FMTERR: - adios(NULL, "message format error in component #%d", + adios(EX_DATAERR, NULL, "message format error in component #%d", compnum); default: - adios(NULL, "getfld() returned %d", state); + adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); } /* break out of the loop */ @@ -316,7 +311,7 @@ get_content(FILE *in, char *file, int toplevel) advise(NULL, "message %s has multiple %s: fields", ct->c_file, VRSN_FIELD); goto next_header; } - ct->c_vrsn = getcpy(hp->value); + ct->c_vrsn = mh_xstrdup(hp->value); /* Now, cleanup this field */ cp = ct->c_vrsn; @@ -388,7 +383,7 @@ get_content(FILE *in, char *file, int toplevel) } /* get copy of this field */ - ct->c_celine = cp = getcpy(hp->value); + ct->c_celine = cp = mh_xstrdup(hp->value); while (isspace(*cp)) cp++; @@ -480,7 +475,7 @@ add_header(CT ct, char *name, char *value) HF hp; /* allocate header field structure */ - hp = mh_xmalloc(sizeof(*hp)); + hp = mh_xcalloc(1, sizeof(*hp)); /* link data into header structure */ hp->name = name; @@ -535,24 +530,24 @@ incl_name_value(unsigned char *buf, char *name, char *value) { ** Insert at first semicolon, if any. ** If none, append to end. */ - prefix = getcpy(buf); + prefix = mh_xstrdup(buf); if ((cp = strchr(prefix, ';'))) { suffix = concat(cp, NULL); *cp = '\0'; newbuf = concat(prefix, insertion, suffix, "\n", NULL); - free(suffix); + mh_free0(&suffix); } else { /* Append to end. */ newbuf = concat(buf, insertion, "\n", NULL); } - free(prefix); - free(insertion); - free(buf); + mh_free0(&prefix); + mh_free0(&insertion); + mh_free0(&buf); } - free(name_plus_equal); + mh_free0(&name_plus_equal); } return newbuf; @@ -570,7 +565,7 @@ extract_name_value(char *name_suffix, char *value) { char *name_suffix_equals = strstr(value, name_suffix_plus_quote); char *cp; - free(name_suffix_plus_quote); + mh_free0(&name_suffix_plus_quote); if (name_suffix_equals) { char *name_suffix_begin; @@ -582,7 +577,7 @@ extract_name_value(char *name_suffix, char *value) { for (; *cp != '"'; ++cp) ; - extracted_name_value = mh_xmalloc(cp - name_suffix_begin + 1); + extracted_name_value = mh_xcalloc(cp - name_suffix_begin + 1, sizeof(char)); memcpy(extracted_name_value, name_suffix_begin, cp - name_suffix_begin); extracted_name_value[cp - name_suffix_begin] = '\0'; @@ -608,7 +603,7 @@ get_ctinfo(unsigned char *cp, CT ct, int magic) i = strlen(invo_name) + 2; /* store copy of Content-Type line */ - cp = ct->c_ctline = getcpy(cp); + cp = ct->c_ctline = mh_xstrdup(cp); while (isspace(*cp)) /* trim leading spaces */ cp++; @@ -632,7 +627,7 @@ get_ctinfo(unsigned char *cp, CT ct, int magic) for (dp = cp; istoken(*dp); dp++) continue; c = *dp, *dp = '\0'; - ci->ci_type = getcpy(cp); /* store content type */ + ci->ci_type = mh_xstrdup(cp); /* store content type */ *dp = c, cp = dp; if (!*ci->ci_type) { @@ -654,7 +649,7 @@ get_ctinfo(unsigned char *cp, CT ct, int magic) if (*cp != '/') { if (!magic) - ci->ci_subtype = getcpy(""); + ci->ci_subtype = mh_xstrdup(""); goto magic_skip; } @@ -668,7 +663,7 @@ get_ctinfo(unsigned char *cp, CT ct, int magic) for (dp = cp; istoken(*dp); dp++) continue; c = *dp, *dp = '\0'; - ci->ci_subtype = getcpy(cp); /* store the content subtype */ + ci->ci_subtype = mh_xstrdup(cp); /* store the content subtype */ *dp = c, cp = dp; if (!*ci->ci_subtype) { @@ -725,7 +720,7 @@ magic_skip: return NOTOK; } - vp = (*ap = getcpy(cp)) + (up - cp); + vp = (*ap = mh_xstrdup(cp)) + (up - cp); *vp = '\0'; for (dp++; isspace(*dp);) dp++; @@ -764,7 +759,9 @@ bad_quote: } if (!*vp) { advise(NULL, "invalid parameter in message %s's %s: field\n%*.*s(parameter %s)", ct->c_file, TYPE_FIELD, i, i, "", *ap); - return NOTOK; + *ci->ci_values[ap - ci->ci_attrs] = '\0'; + *ci->ci_attrs[ap - ci->ci_attrs] = '\0'; + continue; } ap++; @@ -780,8 +777,7 @@ bad_quote: */ if (magic && *cp == '<') { if (ct->c_id) { - free(ct->c_id); - ct->c_id = NULL; + mh_free0(&(ct->c_id)); } if (!(dp = strchr(ct->c_id = ++cp, '>'))) { advise(NULL, "invalid ID in message %s", ct->c_file); @@ -861,7 +857,7 @@ bad_quote: */ if (*cp) { if (magic) { - ci->ci_magic = getcpy(cp); + ci->ci_magic = mh_xstrdup(cp); /* ** If there is a Content-Disposition header and @@ -928,9 +924,9 @@ invalid: if (istype) { if ((dp = ci->ci_comment)) { ci->ci_comment = concat(dp, " ", buffer, NULL); - free(dp); + mh_free0(&dp); } else { - ci->ci_comment = getcpy(buffer); + ci->ci_comment = mh_xstrdup(buffer); } } @@ -979,8 +975,7 @@ InitText(CT ct) ct->c_subtype = kv->kv_value; /* allocate text character set structure */ - if ((t = (struct text *) calloc(1, sizeof(*t))) == NULL) - adios(NULL, "out of memory"); + t = mh_xcalloc(1, sizeof(*t)); ct->c_ctparams = (void *) t; /* scan for charset parameter */ @@ -991,7 +986,7 @@ InitText(CT ct) /* check if content specified a character set */ if (*ap) { /* store its name */ - ct->c_charset = getcpy(norm_charmap(*ep)); + ct->c_charset = mh_xstrdup(norm_charmap(*ep)); /* match character set or set to CHARSET_UNKNOWN */ for (kv = Charset; kv->kv_key; kv++) { if (!mh_strcasecmp(*ep, kv->kv_key)) { @@ -1033,7 +1028,7 @@ InitMultiPart(CT ct) if (ct->c_encoding != CE_7BIT && ct->c_encoding != CE_8BIT && ct->c_encoding != CE_BINARY) { admonish(NULL, "\"%s/%s\" type in message %s must be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); - return NOTOK; + ct->c_encoding = CE_7BIT; } /* match subtype */ @@ -1061,8 +1056,7 @@ InitMultiPart(CT ct) } /* allocate primary structure for multipart info */ - if ((m = (struct multipart *) calloc(1, sizeof(*m))) == NULL) - adios(NULL, "out of memory"); + m = mh_xcalloc(1, sizeof(*m)); ct->c_ctparams = (void *) m; /* check if boundary parameter contains only whitespace characters */ @@ -1105,9 +1099,7 @@ InitMultiPart(CT ct) if (strcmp(buffer + 2, m->mp_start)!=0) continue; next_part: - if ((part = (struct part *) calloc(1, sizeof(*part))) - == NULL) - adios(NULL, "out of memory"); + part = mh_xcalloc(1, sizeof(*part)); *next = part; next = &part->mp_next; @@ -1150,7 +1142,7 @@ end_part: continue; *next = NULL; free_content(p); - free((char *) part); + mh_free0(&part); } } @@ -1181,7 +1173,7 @@ last_part: p = part->mp_part; sprintf(pp, "%d", partnum); - p->c_partno = getcpy(partnam); + p->c_partno = mh_xstrdup(partnam); /* initialize the content of the subparts */ if (p->c_ctinitfnx && (*p->c_ctinitfnx) (p) == NOTOK) { @@ -1221,8 +1213,7 @@ reverse_parts(CT ct) i++; /* allocate array of pointers to the parts */ - if (!(base = (struct part **) calloc((size_t) (i + 1), sizeof(*base)))) - adios(NULL, "out of memory"); + base = mh_xcalloc(i + 1, sizeof(*base)); bmp = base; /* point at all the parts */ @@ -1240,7 +1231,7 @@ reverse_parts(CT ct) *next = NULL; /* free array of pointers */ - free((char *) base); + mh_free0(&base); } @@ -1278,8 +1269,7 @@ InitMessage(CT ct) char **ap, **ep; struct partial *p; - if ((p = (struct partial *) calloc(1, sizeof(*p))) == NULL) - adios(NULL, "out of memory"); + p = mh_xcalloc(1, sizeof(*p)); ct->c_ctparams = (void *) p; /* @@ -1288,7 +1278,7 @@ InitMessage(CT ct) */ for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { if (!mh_strcasecmp(*ap, "id")) { - p->pm_partid = getcpy(*ep); + p->pm_partid = mh_xstrdup(*ep); continue; } if (!mh_strcasecmp(*ap, "number")) { @@ -1391,8 +1381,7 @@ init_encoding(CT ct, OpenCEFunc openfnx) { CE ce; - if ((ce = (CE) calloc(1, sizeof(*ce))) == NULL) - adios(NULL, "out of memory"); + ce = mh_xcalloc(1, sizeof(*ce)); ct->c_cefile = ce; ct->c_ceopenfnx = openfnx; @@ -1522,10 +1511,10 @@ openBase64(CT ct, char **file) } if (*file == NULL) { - ce->ce_file = getcpy(m_mktemp(tmp, NULL, NULL)); + ce->ce_file = mh_xstrdup(m_mktemp(tmp, NULL, NULL)); ce->ce_unlink = 1; } else { - ce->ce_file = getcpy(*file); + ce->ce_file = mh_xstrdup(*file); ce->ce_unlink = 0; } @@ -1545,13 +1534,13 @@ openBase64(CT ct, char **file) ** Temporary file already exists, so we rename to ** version with extension. */ - char *file_org = strdup(ce->ce_file); + char *file_org = mh_xstrdup(ce->ce_file); ce->ce_file = add(cp, ce->ce_file); if (rename(file_org, ce->ce_file)) { - adios(ce->ce_file, "unable to rename %s to ", + adios(EX_IOERR, ce->ce_file, "unable to rename %s to ", file_org); } - free(file_org); + mh_free0(&file_org); } else { ce->ce_file = add(cp, ce->ce_file); @@ -1565,7 +1554,7 @@ openBase64(CT ct, char **file) } if ((len = ct->c_end - ct->c_begin) < 0) - adios(NULL, "internal error(1)"); + adios(EX_SOFTWARE, NULL, "internal error(1)"); if (!ct->c_fp) { if ((ct->c_fp = fopen(ct->c_file, "r")) == NULL) { @@ -1733,10 +1722,10 @@ openQuoted(CT ct, char **file) } if (*file == NULL) { - ce->ce_file = getcpy(m_mktemp(tmp, NULL, NULL)); + ce->ce_file = mh_xstrdup(m_mktemp(tmp, NULL, NULL)); ce->ce_unlink = 1; } else { - ce->ce_file = getcpy(*file); + ce->ce_file = mh_xstrdup(*file); ce->ce_unlink = 0; } @@ -1756,13 +1745,13 @@ openQuoted(CT ct, char **file) ** Temporary file already exists, so we rename to ** version with extension. */ - char *file_org = strdup(ce->ce_file); + char *file_org = mh_xstrdup(ce->ce_file); ce->ce_file = add(cp, ce->ce_file); if (rename(file_org, ce->ce_file)) { - adios(ce->ce_file, "unable to rename %s to ", + adios(EX_IOERR, ce->ce_file, "unable to rename %s to ", file_org); } - free(file_org); + mh_free0(&file_org); } else { ce->ce_file = add(cp, ce->ce_file); @@ -1776,7 +1765,7 @@ openQuoted(CT ct, char **file) } if ((len = ct->c_end - ct->c_begin) < 0) - adios(NULL, "internal error(2)"); + adios(EX_SOFTWARE, NULL, "internal error(2)"); if (!ct->c_fp) { if ((ct->c_fp = fopen(ct->c_file, "r")) == NULL) { @@ -1950,10 +1939,10 @@ open7Bit(CT ct, char **file) } if (*file == NULL) { - ce->ce_file = getcpy(m_mktemp(tmp, NULL, NULL)); + ce->ce_file = mh_xstrdup(m_mktemp(tmp, NULL, NULL)); ce->ce_unlink = 1; } else { - ce->ce_file = getcpy(*file); + ce->ce_file = mh_xstrdup(*file); ce->ce_unlink = 0; } @@ -1973,13 +1962,13 @@ open7Bit(CT ct, char **file) ** Temporary file already exists, so we rename to ** version with extension. */ - char *file_org = strdup(ce->ce_file); + char *file_org = mh_xstrdup(ce->ce_file); ce->ce_file = add(cp, ce->ce_file); if (rename(file_org, ce->ce_file)) { - adios(ce->ce_file, "unable to rename %s to ", + adios(EX_IOERR, ce->ce_file, "unable to rename %s to ", file_org); } - free(file_org); + mh_free0(&file_org); } else { ce->ce_file = add(cp, ce->ce_file); @@ -2042,7 +2031,7 @@ open7Bit(CT ct, char **file) } if ((len = ct->c_end - ct->c_begin) < 0) - adios(NULL, "internal error(3)"); + adios(EX_SOFTWARE, NULL, "internal error(3)"); if (!ct->c_fp) { if ((ct->c_fp = fopen(ct->c_file, "r")) == NULL) {