X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fm_getfld2.c;h=a17eb03a82c3960ea5f3d894393af1e9d2cbf53c;hp=6eb0ef8c311491acd18b8e730e4523b4cff782e3;hb=d6321964322004b6fc7efbccbc97f92cee905ae7;hpb=4e6362c1749f16f1b09fb04d5951a03c1d9aa9cd diff --git a/sbr/m_getfld2.c b/sbr/m_getfld2.c index 6eb0ef8..a17eb03 100644 --- a/sbr/m_getfld2.c +++ b/sbr/m_getfld2.c @@ -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= NAMESZ) {