Return invalid line for FMTERR in m_getfld2()
authormarkus schnalke <meillo@marmaro.de>
Tue, 10 Nov 2015 19:58:31 +0000 (20:58 +0100)
committermarkus schnalke <meillo@marmaro.de>
Tue, 10 Nov 2015 20:06:12 +0000 (21:06 +0100)
This is necessary for mbox handling outside of m_getfld2().

sbr/m_getfld2.c

index 6eb0ef8..91164f3 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);
                }