X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/c4d932d08940f689b39b654a714f9ef3657690a9..683e0fb1a14da5b9ce7bc5db6e76951d14d79348:/uip/mhparse.c diff --git a/uip/mhparse.c b/uip/mhparse.c index 4c3a1946..f5a5983a 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -22,8 +22,6 @@ extern int debugsw; -extern int endian; /* mhmisc.c */ - extern pid_t xpid; /* mhshowsbr.c */ /* cache policies */ @@ -48,11 +46,7 @@ struct k2v SubText[] = { { NULL, TEXT_UNKNOWN } /* this one must be last! */ }; -struct k2v Charset[] = { - { "us-ascii", CHARSET_USASCII }, - { "iso-8859-1", CHARSET_LATIN }, - { NULL, CHARSET_UNKNOWN } /* this one must be last! */ -}; +/* Charset[] removed -- yozo. Mon Oct 8 01:03:41 JST 2012 */ /* * Structures for MULTIPART messages @@ -268,6 +262,7 @@ get_content (FILE *in, char *file, int toplevel) char *np, *vp; CT ct; HF hp; + long filepos; /* allocate the content structure */ if (!(ct = (CT) calloc (1, sizeof(*ct)))) @@ -275,18 +270,20 @@ get_content (FILE *in, char *file, int toplevel) ct->c_fp = in; ct->c_file = add (file, NULL); - ct->c_begin = ftell (ct->c_fp) + 1; + ct->c_begin = (filepos = ftell (ct->c_fp)) + 1; /* * Parse the header fields for this * content into a linked list. */ for (compnum = 1, state = FLD;;) { - switch (state = m_getfld (state, name, buf, sizeof(buf), in)) { + int bufsz = sizeof buf; + switch (state = m_getfld (state, name, buf, &bufsz, in)) { case FLD: case FLDPLUS: case FLDEOF: compnum++; + filepos += bufsz; /* get copies of the buffers */ np = add (name, NULL); @@ -294,7 +291,8 @@ get_content (FILE *in, char *file, int toplevel) /* if necessary, get rest of field */ while (state == FLDPLUS) { - state = m_getfld (state, name, buf, sizeof(buf), in); + bufsz = sizeof buf; + state = m_getfld (state, name, buf, &bufsz, in); vp = add (buf, vp); /* add to previous value */ } @@ -303,18 +301,20 @@ get_content (FILE *in, char *file, int toplevel) /* continue, if this isn't the last header field */ if (state != FLDEOF) { - ct->c_begin = ftell (in) + 1; + ct->c_begin = filepos + 1; continue; } /* else fall... */ case BODY: case BODYEOF: - ct->c_begin = ftell (in) - strlen (buf); + filepos += bufsz; + ct->c_begin = filepos - strlen (buf); break; case FILEEOF: - ct->c_begin = ftell (in); + filepos += bufsz; + ct->c_begin = filepos; break; case LENERR: @@ -1079,14 +1079,8 @@ InitText (CT ct) /* check if content specified a character set */ if (*ap) { - /* match character set or set to CHARSET_UNKNOWN */ - for (kv = Charset; kv->kv_key; kv++) { - if (!mh_strcasecmp (*ep, kv->kv_key)) { - chset = *ep; - break; - } - } - t->tx_charset = kv->kv_value; + chset = *ep; + t->tx_charset = CHARSET_SPECIFIED; } else { t->tx_charset = CHARSET_UNSPECIFIED; } @@ -1728,8 +1722,8 @@ openBase64 (CT ct, char **file) { int bitno, cc, digested; int fd, len, skip, own_ct_fp = 0; - unsigned long bits; - unsigned char value, *b, *b1, *b2, *b3; + uint32_t bits; + unsigned char value, b; unsigned char *cp, *ep; char buffer[BUFSIZ]; /* sbeck -- handle suffixes */ @@ -1737,11 +1731,6 @@ openBase64 (CT ct, char **file) CE ce; MD5_CTX mdContext; - b = (unsigned char *) &bits; - b1 = &b[endian > 0 ? 1 : 2]; - b2 = &b[endian > 0 ? 2 : 1]; - b3 = &b[endian > 0 ? 3 : 0]; - ce = ct->c_cefile; if (ce->ce_fp) { fseek (ce->ce_fp, 0L, SEEK_SET); @@ -1850,17 +1839,20 @@ openBase64 (CT ct, char **file) bits |= value << bitno; test_end: if ((bitno -= 6) < 0) { - putc ((char) *b1, ce->ce_fp); + b = (bits >> 16) & 0xff; + putc ((char) b, ce->ce_fp); if (digested) - MD5Update (&mdContext, b1, 1); + MD5Update (&mdContext, &b, 1); if (skip < 2) { - putc ((char) *b2, ce->ce_fp); + b = (bits >> 8) & 0xff; + putc ((char) b, ce->ce_fp); if (digested) - MD5Update (&mdContext, b2, 1); + MD5Update (&mdContext, &b, 1); if (skip < 1) { - putc ((char) *b3, ce->ce_fp); + b = bits & 0xff; + putc ((char) b, ce->ce_fp); if (digested) - MD5Update (&mdContext, b3, 1); + MD5Update (&mdContext, &b, 1); } } @@ -2820,15 +2812,10 @@ static int readDigest (CT ct, char *cp) { int bitno, skip; - unsigned long bits; + uint32_t bits; char *bp = cp; unsigned char *dp, value, *ep; - unsigned char *b, *b1, *b2, *b3; - b = (unsigned char *) &bits, - b1 = &b[endian > 0 ? 1 : 2], - b2 = &b[endian > 0 ? 2 : 1], - b3 = &b[endian > 0 ? 3 : 0]; bitno = 18; bits = 0L; skip = 0; @@ -2850,11 +2837,11 @@ test_end: if ((bitno -= 6) < 0) { if (dp + (3 - skip) > ep) goto invalid_digest; - *dp++ = *b1; + *dp++ = (bits >> 16) & 0xff; if (skip < 2) { - *dp++ = *b2; + *dp++ = (bits >> 8) & 0xff; if (skip < 1) - *dp++ = *b3; + *dp++ = bits & 0xff; } bitno = 18; bits = 0L;