m_getfld2: Whitespace in component name is forbidden
[mmh] / sbr / m_getfld2.c
index 6eb0ef8..a17eb03 100644 (file)
@@ -26,8 +26,8 @@ static size_t copyname(char *, char *);
 
 
 /*
-** For the states FLD2, BODY2 memory is allocated for f->value.
-** For the states LENERR2, FMTERR2, ERR2 and FILEEOF2 no memory is allocated.
+** For the states FLD2, BODY2 and FMTERR2 memory is allocated for f->value.
+** For the states LENERR2, ERR2 and FILEEOF2 no memory is allocated.
 */
 enum state
 m_getfld2(enum state s, struct field *f, FILE *msg)
@@ -51,10 +51,18 @@ m_getfld2(enum state s, struct field *f, FILE *msg)
                return LENERR2;
        }
 
+       *f->name = '\0';
+       f->namelen = 0;
+
        switch (s) {
        case FLD2:
                if (*(tmpline + nchars - 1) != '\n') {
-                       free(tmpline);
+                       if (f->value) {
+                               free(f->value);
+                       }
+                       f->value = tmpline;
+                       f->valuelen = nchars;
+                       f->alloclen = len;
                        return FMTERR2;
                }
 
@@ -66,7 +74,12 @@ m_getfld2(enum state s, struct field *f, FILE *msg)
 
                f->namelen = copyname(f->name, tmpline);
                if (f->namelen < 1) {
-                       free(tmpline);
+                       if (f->value) {
+                               free(f->value);
+                       }
+                       f->value = tmpline;
+                       f->valuelen = nchars;
+                       f->alloclen = len;
                        return FMTERR2;
                }
 
@@ -91,7 +104,12 @@ m_getfld2(enum state s, struct field *f, FILE *msg)
                        }
 
                        if (*(tmpline + nchars - 1) != '\n') {
-                               free(tmpline);
+                               if (f->value) {
+                                       free(f->value);
+                               }
+                               f->value = tmpline;
+                               f->valuelen = nchars;
+                               f->alloclen = len;
                                return FMTERR2;
                        }
 
@@ -114,8 +132,6 @@ m_getfld2(enum state s, struct field *f, FILE *msg)
                return FLD2;
 
        case BODY2:
-               *f->name = '\0';
-               f->namelen = 0;
                if (f->value) {
                        free(f->value);
                }
@@ -159,11 +175,17 @@ static size_t
 copyname(char *dst, char *src)
 {
        size_t len;
-       char *sep = strchr(src, ':');
+       char *cp, *sep;
 
-       if (!sep) {
+       if (!(sep = strchr(src, ':'))) {
                return 0;
        }
+       /* whitespace is forbidden in name */
+       for (cp=src; cp<sep; cp++) {
+               if (isspace(*cp)) {
+                       return 0;
+               }
+       }
 
        len = sep - src;
        if (len >= NAMESZ) {