m_getfld_state_t s = *gstate;
if (s) {
- if (s->fdelim) free (s->fdelim-1);
+ if (s->fdelim) {
+ free (s->fdelim-1);
+ free (s->pat_map);
+ }
free (s);
*gstate = 0;
}
n = 0;
for (finished = 0; ! finished; ) {
while (c != '\n' && c != EOF && n++ < max) {
- *cp++ = c = Getc (s);
+ if ((c = Getc (s)) != EOF) { *cp++ = c; }
}
if (c != EOF) c = Peek (s);
if (max < n) {
- /* the dest buffer is full */
+ /* The dest buffer is full. Need to back the read
+ pointer up by one because when m_getfld() is
+ reentered, it will read a character. Then
+ we'll jump right to the FLDPLUS handling code,
+ which will not store that character, but
+ instead move on to the next one. */
+ if (s->readpos > s->msg_buf) {
+ --s->readpos;
+ --s->bytes_read;
+ }
s->state = FLDPLUS;
finished = 1;
} else if (c != ' ' && c != '\t') {
s->msg_style = MS_UNKNOWN;
for (i = 0, cp = text; i < sizeof text; ++i, ++cp) {
- if ((*cp = Getc (s)) == EOF) {
+ if ((signed char) (*cp = Getc (s)) == EOF) {
break;
}
}
} else {
/* not a Unix style maildrop */
s->readpos -= s->bytes_read;
+ s->bytes_read = 0;
delimstr = mmdlm2;
s->msg_style = MS_MMDF;
}
char *cp;
for (i = 0, cp = text; i < s->edelimlen; ++i, ++cp) {
- if ((*cp = Getc (s)) == EOF) {
+ if ((signed char) (*cp = Getc (s)) == EOF) {
break;
}
}
Note that on input, a character had already been read
with Getc(). It will be unget by m_getfld () on return. */
s->readpos -= s->bytes_read - 1;
+ s->bytes_read = 1;
return 0;
}