case FLDPLUS:
compnum++;
- /* abort if draft has Mime-Version or C-T-E header field */
- if (strcasecmp (name, VRSN_FIELD) == 0 ||
- strcasecmp (name, ENCODING_FIELD) == 0) {
+ /*
+ * If we are running with autobuild set, then silently
+ * exit if we find a MIME-Version header. For any other MIME
+ * header, return an error.
+ *
+ * RFC 2045, Section 9 says that any valid MIME header should
+ * start with "Content-", so we will match on that rather than
+ * enumerate all current MIME headers.
+ *
+ * Because the headers could be in any order, just check for
+ * MIME-Version here; check for Content-* later.
+ */
+
+ if (strcasecmp (name, VRSN_FIELD) == 0) {
if (autobuild) {
fclose(in);
free (ct);
die("draft shouldn't contain %s: field", name);
}
- /* ignore any Content-Type fields in the header */
- if (!strcasecmp (name, TYPE_FIELD)) {
- while (state == FLDPLUS) {
- bufsz = sizeof buf;
- state = m_getfld2(&gstate, name, buf, &bufsz);
- }
- goto finish_field;
- }
-
/* get copies of the buffers */
np = mh_xstrdup(name);
vp = mh_xstrdup(buf);
}
m_getfld_state_destroy (&gstate);
+ /*
+ * If we see any Content-* headers at this point, it is an error.
+ */
+
+ for (hp = ct->c_first_hf; hp != NULL; hp = hp->next) {
+ if (uprf (hp->name, "Content-")) {
+ die ("draft shouldn't contain %s: field", hp->name);
+ }
+ }
+
if (header_encoding != CE_8BIT) {
/*
* Iterate through the list of headers and call the function to MIME-ify
user_content (FILE *in, char *buf, CT *ctp, const char *infilename)
{
int extrnal, vrsn;
- char *cp, **ap;
+ char *cp, *const *ap;
char buffer[NMH_BUFSIZ];
struct multipart *m;
struct part **pp;
ce->ce_unlink = 1;
if (do_direct() && (buf[0] == '#' && buf[1] == '<')) {
- strncpy (content, buf + 2, sizeof(content));
+ strncpy (content, buf + 2, sizeof(content) - 1);
inlineD = true;
goto rock_and_roll;
}
/* the directive is implicit */
strncpy (content, "text/plain", sizeof(content));
headers = 0;
- strncpy (buffer, (!do_direct() || buf[0] != '#') ? buf : buf + 1, sizeof(buffer));
+ strncpy (buffer, (!do_direct() || buf[0] != '#') ? buf : buf + 1,
+ sizeof(buffer) - 1);
for (;;) {
int i;