From 327eb432aa6884bf3bac6ef0dd6c63e0dc5198f2 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Wed, 20 Jun 2001 05:02:11 +0000 Subject: Miscellaneous bug fixes. svn path=/trunk/; revision=3361 --- NEWS | 4 ++++ fetchmailconf | 10 +++++----- options.c | 2 +- rfc822.c | 2 +- sink.c | 4 ++-- transact.c | 50 +++++++++++++++++++++++++++++++++++++------------- 6 files changed, 50 insertions(+), 22 deletions(-) diff --git a/NEWS b/NEWS index 1bc55f5e..57c13458 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,10 @@ * Fix bug that prevented messages from being marked oversized unless -v was on. * Byrial Jensen made the tracepoll information RFC822-conformant. * Reorder code to avoid accessing line buffers after they have been freed. +* Steven Krings's patch to deal with over-long header lines. +* Fix for Debian bug #101500. +* Updated Danish translation by Byrial Jensen. +* Chris Maio's patch for POP3 with BSMTP. fetchmail-5.8.7 (Sun Jun 17 12:02:17 EDT 2001), 20749 lines: diff --git a/fetchmailconf b/fetchmailconf index 650e3e8b..c84a9b4e 100755 --- a/fetchmailconf +++ b/fetchmailconf @@ -94,7 +94,7 @@ class Server: self.plugout = None # Plugin command for going to listener self.netsec = None # IPV6 security options self.principal = None # Kerberos principal - self.tracepolls = FALSE # Add X-Fetchmail-Account header? + self.tracepolls = FALSE # Add trace-poll info to headers self.users = [] # List of user entries for site Server.typemap = ( ('pollname', 'String'), @@ -104,7 +104,7 @@ class Server: ('protocol', 'String'), ('port', 'Int'), ('uidl', 'Boolean'), - ('auth', 'String'), + ('auth', 'String'), ('timeout', 'Int'), ('envelope', 'String'), ('envskip', 'Int'), @@ -168,8 +168,8 @@ class Server: else: res = res + " " - if self.tracepolls: - res = res + "tracepolls\n" + if self.tracepolls: + res = res + "tracepolls\n" if self.interface: res = res + "interface " + str(self.interface) @@ -292,7 +292,7 @@ class User: if self.localnames: res = res + "is" for x in self.localnames: - res = res + " " + x + res = res + " " + `x` res = res + " here" if (self.keep != UserDefaults.keep or self.flush != UserDefaults.flush diff --git a/options.c b/options.c index c1f77554..d9e5aa14 100644 --- a/options.c +++ b/options.c @@ -672,7 +672,7 @@ struct query *ctl; /* option record to be initialized */ P(_(" -E, --envelope envelope address header\n")); P(_(" -Q, --qvirtual prefix to remove from local user id\n")); P(_(" --principal mail service principal\n")); - P(_(" --addaccthdr add an X-Fetchmail-Account header (\"label \")\n")); + P(_(" --tracepolls add poll-tracing information to Received header\n")); P(_(" -u, --username specify users's login on server\n")); P(_(" -a, --all retrieve old and new messages\n")); diff --git a/rfc822.c b/rfc822.c index 4724b8e2..909b1b7b 100644 --- a/rfc822.c +++ b/rfc822.c @@ -16,7 +16,7 @@ #include "fetchmail.h" #include "i18n.h" -#define HEADER_END(p) ((p)[0] == '\n' && ((p)[1] != ' ' && (p)[1] != '\t' && (p)[1] != '\0')) +#define HEADER_END(p) ((p)[0] == '\n' && ((p)[1] != ' ' && (p)[1] != '\t')) #ifdef TESTMAIN static int verbose; diff --git a/sink.c b/sink.c index fb671b6e..4bf5fd9c 100644 --- a/sink.c +++ b/sink.c @@ -938,7 +938,7 @@ int open_sink(struct query *ctl, struct msgblk *msg, void release_sink(struct query *ctl) /* release the per-message output sink, whether it's a pipe or SMTP socket */ { - if (ctl->bsmtp) + if (ctl->bsmtp && sinkfp) fclose(sinkfp); else if (ctl->mda) { @@ -984,7 +984,7 @@ int close_sink(struct query *ctl, struct msgblk *msg, flag forward) return(FALSE); } } - else if (ctl->bsmtp) + else if (ctl->bsmtp && sinkfp) { int error; diff --git a/transact.c b/transact.c index 73c133f7..b758a6f9 100644 --- a/transact.c +++ b/transact.c @@ -387,6 +387,7 @@ int readheaders(int sock, for (remaining = fetchlen; remaining > 0 || protocol->delimited; remaining -= linelen) { char *line; + int overlong = FALSE; line = xmalloc(sizeof(buf)); linelen = 0; @@ -404,6 +405,19 @@ int readheaders(int sock, linelen += n; msgblk.msglen += n; + /* + * Try to gracefully handle the case, where the length of a + * line exceeds MSGBUFSIZE. + */ + if ( n && buf[n-1] != '\n' ) { + unsigned int llen = strlen(line); + overlong = TRUE; + line = realloc(line, llen + n + 1); + strcpy(line + llen, buf); + ch = ' '; /* So the next iteration starts */ + continue; + } + /* lines may not be properly CRLF terminated; fix this for qmail */ if (ctl->forcecr) { @@ -416,17 +430,27 @@ int readheaders(int sock, } } - /* - * Decode MIME encoded headers. We MUST do this before - * looking at the Content-Type / Content-Transfer-Encoding - * headers (RFC 2046). - */ - if (ctl->mimedecode) - UnMimeHeader(buf); - - line = (char *) realloc(line, strlen(line) + strlen(buf) +1); + /* + * Decode MIME encoded headers. We MUST do this before + * looking at the Content-Type / Content-Transfer-Encoding + * headers (RFC 2046). + */ + if ( ctl->mimedecode && overlong ) { + /* + * If we received an overlong line, we have to decode the + * whole line at once. + */ + line = (char *) realloc(line, strlen(line) + strlen(buf) +1); + strcat(line, buf); + UnMimeHeader(line); + } + else { + if ( ctl->mimedecode ) + UnMimeHeader(buf); - strcat(line, buf); + line = (char *) realloc(line, strlen(line) + strlen(buf) +1); + strcat(line, buf); + } /* check for end of headers */ if (EMPTYLINE(line)) @@ -444,8 +468,8 @@ int readheaders(int sock, */ if (protocol->delimited && line[0] == '.' && EMPTYLINE(line+1)) { - free(line); has_nuls = (linelen != strlen(line)); + free(line); goto process_headers; } @@ -1006,7 +1030,7 @@ int readheaders(int sock, * This header is technically invalid under RFC822. * POP3, IMAP, etc. are not legal mail-parameter values. */ - sprintf(buf, "\tby %s with %s (fetchmail-%s)", + sprintf(buf, "\tby %s with %s (fetchmail-%s", fetchmailhost, protocol->name, VERSION); @@ -1016,7 +1040,7 @@ int readheaders(int sock, ctl->server.pollname, ctl->remotename); } - strcat(buf, "\r\n"); + strcat(buf, ")\r\n"); n = stuffline(ctl, buf); if (n != -1) { -- cgit v1.2.3