X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fm_getfld2.c;h=b9a618d166e245a37854003610f5a9cb1576ef0c;hp=6545d0f7539632b54a6f50d92b43f151b4c12d71;hb=1642d62841486ade88ec2c48dd581e3249c98c94;hpb=a87df3543d3bc128ba4079d1f95638476ba5ca50 diff --git a/sbr/m_getfld2.c b/sbr/m_getfld2.c index 6545d0f..b9a618d 100644 --- a/sbr/m_getfld2.c +++ b/sbr/m_getfld2.c @@ -10,7 +10,6 @@ #include #include #include -#include enum threestate { @@ -24,9 +23,7 @@ enum threestate { */ static enum threestate is_falted(FILE *); static size_t copyname(char *, char *); -static bool is_separator(char *); - -struct field free_field = { "\0", 0, NULL, 0, 0 }; +static boolean is_separator(char *); /* @@ -57,7 +54,7 @@ m_getfld2(enum state s, struct field *f, FILE *msg) nchars = getline(&tmpline, &len, msg); if (nchars < 1) { free(f->value); - *f = free_field; + *f = (struct field) { "\0", 0, NULL, 0, 0 }; if (feof(msg)) { return FILEEOF2; } else { @@ -65,7 +62,8 @@ m_getfld2(enum state s, struct field *f, FILE *msg) } } - if (nchars >= NAMESZ) { + f->crlf = (nchars > 2 && tmpline[nchars-2] == '\r'); + if (nchars > NAMESZ+1 || (!f->crlf && nchars > NAMESZ)) { ret = LENERR2; } @@ -99,14 +97,14 @@ m_getfld2(enum state s, struct field *f, FILE *msg) f->valuelen = nchars; } - while (ret == FLD2 && (falted = is_falted(msg)) == B_TRUE) { + while ((ret == FLD2 || ret == LENERR2) && (falted = is_falted(msg)) == B_TRUE) { nchars = getline(&tmpline, &len, msg); if (nchars <= 0) { free(tmpline); return IOERR2; } - if (nchars >= NAMESZ) { + if (nchars > NAMESZ+1 || (!f->crlf && nchars > NAMESZ)) { ret = LENERR2; } @@ -132,12 +130,15 @@ m_getfld2(enum state s, struct field *f, FILE *msg) return ret; case BODY2: - free(f->value); - *f = free_field; + *f->name = '\0'; + f->namelen = 0; nchars = getline(&tmpline, &len, msg); if (nchars < 1) { - free(tmpline); + free(f->value); + f->value = NULL; + f->valuelen = 0; + f->alloclen = 0; if (feof(msg)) { return FILEEOF2; } else { @@ -145,10 +146,8 @@ m_getfld2(enum state s, struct field *f, FILE *msg) } } - if (nchars >= NAMESZ) { - ret = LENERR2; - } - + f->crlf = (nchars > 2 && tmpline[nchars-2] == '\r'); + free(f->value); f->value = tmpline; f->valuelen = nchars; f->alloclen = len; @@ -202,7 +201,7 @@ copyname(char *dst, char *src) } len = sep - src; - if (len >= NAMESZ) { + if (len >= NAMESZ - 1) { return 0; } @@ -212,7 +211,7 @@ copyname(char *dst, char *src) return strlen(dst); } -static bool +static boolean is_separator(char *line) { /* @@ -223,7 +222,7 @@ is_separator(char *line) line++; } if (strcmp("\n", line) == 0 || strcmp("\r\n", line) == 0 ) { - return true; + return TRUE; } - return false; + return FALSE; }