aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
authorbarner <barner@FreeBSD.org>2005-07-21 18:25:32 +0800
committerbarner <barner@FreeBSD.org>2005-07-21 18:25:32 +0800
commit99a14a1d7ecc8299e45ec178616189affb75394d (patch)
tree85511bf94ef9a3852d3fa02439a7f4a7c7c5f2bc /mail
parent7478688a42461e5425755fc5a89467a7df35b3a5 (diff)
downloadfreebsd-ports-gnome-99a14a1d7ecc8299e45ec178616189affb75394d.tar.gz
freebsd-ports-gnome-99a14a1d7ecc8299e45ec178616189affb75394d.tar.zst
freebsd-ports-gnome-99a14a1d7ecc8299e45ec178616189affb75394d.zip
- Update to 6.2.5.1 (security update!)
- Add new master site - Take maintainership (no objections on freebsd-ports, Matthias also favours this option as long as the new FreeBSD maintainer will be responsive and submit patches upstream - promissed :-) Submitted by: Matthias Andree <matthias DOT andree AT gmx DOT de> PR: ports/83805 Obtainted from: http://download.berlios.de/fetchmail/fetchmail-patch-6.2.5.1.gz Security: http://www.vuxml.org/freebsd/3497d7be-2fef-45f4-8162-9063751b573a.html
Diffstat (limited to 'mail')
-rw-r--r--mail/fetchmail/Makefile9
-rw-r--r--mail/fetchmail/files/fetchmailconf2
-rw-r--r--mail/fetchmail/files/patch-r140
-rw-r--r--mail/fetchmail/files/patch-s1237
4 files changed, 284 insertions, 4 deletions
diff --git a/mail/fetchmail/Makefile b/mail/fetchmail/Makefile
index f3fd90fc09f5..7e5e78a56338 100644
--- a/mail/fetchmail/Makefile
+++ b/mail/fetchmail/Makefile
@@ -10,16 +10,17 @@
# want fetchmailconf to work, define WITH_X11
PORTNAME= fetchmail
-PORTVERSION= 6.2.5
-PORTREVISION= 2
+PORTVERSION= 6.2.5.1
CATEGORIES= mail ipv6
MASTER_SITES= http://www.catb.org/~esr/%SUBDIR%/ \
+ http://download.berlios.de/%SUBDIR%/ \
ftp://ftp.ayamura.org/pub/%SUBDIR%/ \
ftp://ftp.win.jp/pub/%SUBDIR%/ \
ftp://ftp.dti.ad.jp/pub/net/mail/%SUBDIR%/
MASTER_SITE_SUBDIR= fetchmail
+DISTNAME= ${PORTNAME}-6.2.5
-MAINTAINER= ports@FreeBSD.org
+MAINTAINER= barner@FreeBSD.org
COMMENT= Batch mail retrieval utility for IMAP/POP2/POP3/APOP/KPOP/ETRN/ODMR
.if defined(WITH_X11)
@@ -69,7 +70,9 @@ DOCS+= README.SSL
PLIST_SUB+= SSLDOCS="%%PORTDOCS%%"
.elif exists(${LOCALBASE}/lib/libssl.a) && exists(${LOCALBASE}/lib/libcrypto.a)
CONFIGURE_ARGS+=-with-includes=${LOCALBASE}/include/openssl --with-ssl=${LOCALBASE}
+.if exists(${LOCALBASE}/lib/libRSAglue.a)
CONFIGURE_ENV+= RSAGLUE=-lRSAglue
+.endif
DOCS+= README.SSL
PLIST_SUB+= SSLDOCS="%%PORTDOCS%%"
.else
diff --git a/mail/fetchmail/files/fetchmailconf b/mail/fetchmail/files/fetchmailconf
index de2194731fda..48312bbb5f4e 100644
--- a/mail/fetchmail/files/fetchmailconf
+++ b/mail/fetchmail/files/fetchmailconf
@@ -11,7 +11,7 @@ if [ -e $PREFIX/bin/python ]; then
exec $PREFIX/libexec/fetchmailconf.bin
else
cat <<EOF
-The fetchmailconf program requires Python with Tkinter , which does not
+The fetchmailconf program requires Python with Tkinter, which does not
appear to be installed on this system. Python/Tkinter can be found in
the FreeBSD Ports Collection under x11-toolkits/py-tkinter.
EOF
diff --git a/mail/fetchmail/files/patch-r1 b/mail/fetchmail/files/patch-r1
new file mode 100644
index 000000000000..598069fab09e
--- /dev/null
+++ b/mail/fetchmail/files/patch-r1
@@ -0,0 +1,40 @@
+--- ./sink.c~ 2003-10-11 00:06:36.000000000 +0200
++++ ./sink.c 2005-07-20 18:26:32.000000000 +0200
+@@ -724,7 +724,7 @@
+
+ /* see the ap computation under the SMTP branch */
+ fprintf(sinkfp,
+- "MAIL FROM: %s", (msg->return_path[0]) ? msg->return_path : user);
++ "MAIL FROM:%s", (msg->return_path[0]) ? msg->return_path : user);
+
+ if (ctl->pass8bits || (ctl->mimemsg & MSG_IS_8BIT))
+ fputs(" BODY=8BITMIME", sinkfp);
+--- ./smtp.c~ 2003-08-06 05:30:18.000000000 +0200
++++ ./smtp.c 2005-07-20 18:26:32.000000000 +0200
+@@ -232,13 +232,13 @@
+ int ok;
+ char buf[MSGBUFSIZE];
+
+- if (strchr(from, '<'))
++ if (from[0]=='<')
+ #ifdef HAVE_SNPRINTF
+ snprintf(buf, sizeof(buf),
+ #else
+ sprintf(buf,
+ #endif /* HAVE_SNPRINTF */
+- "MAIL FROM: %s", from);
++ "MAIL FROM:%s", from);
+ else
+ #ifdef HAVE_SNPRINTF
+ snprintf(buf, sizeof(buf),
+--- Makefile.in.orig Thu Jul 21 11:48:31 2005
++++ Makefile.in Thu Jul 21 11:49:11 2005
+@@ -4,7 +4,7 @@
+ # So just uncomment all the lines marked QNX.
+
+ PACKAGE = fetchmail
+-VERSION = 6.2.5
++VERSION = 6.2.5.1
+
+ # Ultrix 2.2 make doesn't expand the value of VPATH.
+ srcdir = @srcdir@
diff --git a/mail/fetchmail/files/patch-s1 b/mail/fetchmail/files/patch-s1
new file mode 100644
index 000000000000..66a1d7b45e87
--- /dev/null
+++ b/mail/fetchmail/files/patch-s1
@@ -0,0 +1,237 @@
+SECURITY FIX: truncate UIDL replies, lest malicious or compromised
+POP3 servers overflow fetchmail's stack. Debian bug #212762.
+This is a remote root exploit.
+
+--- ./pop3.c~ 2003-10-15 21:22:31.000000000 +0200
++++ ./pop3.c 2005-07-20 18:33:26.000000000 +0200
+@@ -16,7 +16,8 @@
+ #if defined(STDC_HEADERS)
+ #include <stdlib.h>
+ #endif
+-
++#include <errno.h>
++
+ #include "fetchmail.h"
+ #include "socket.h"
+ #include "i18n.h"
+@@ -590,7 +591,8 @@
+ return(PS_SUCCESS);
+ }
+
+-static int pop3_gettopid( int sock, int num , char *id)
++#define POSIX_space "\t\n\v\f\r "
++static int pop3_gettopid(int sock, int num , char *id, size_t idsize)
+ {
+ int ok;
+ int got_it;
+@@ -603,25 +605,51 @@
+ {
+ if (DOTLINE(buf))
+ break;
+- if ( ! got_it && ! strncasecmp("Message-Id:", buf, 11 )) {
+- got_it = 1;
+- /* prevent stack overflows */
+- buf[IDLEN+12] = 0;
+- sscanf( buf+12, "%s", id);
++ if (!got_it && 0 == strncasecmp("Message-Id:", buf, 11)) {
++ char *p = buf + 11;
++ p += strspn(p, POSIX_space);
++ p = strtok(p, POSIX_space);
++ strlcpy(id, p, idsize);
+ }
+ }
+ return 0;
+ }
+
+-static int pop3_getuidl( int sock, int num , char *id)
++/** Parse destructively the UID response (leading +OK must have been
++ * stripped off) in buf, store the number in gotnum, and store the ID
++ * into the caller-provided buffer "id" of size "idsize".
++ * Returns PS_SUCCESS or PS_PROTOCOL for failure. */
++static int parseuid(char *buf, unsigned long *gotnum, char *id, size_t idsize)
++{
++ char *i, *j;
++
++ i = strtok(buf, POSIX_space);
++ errno = 0;
++ *gotnum = strtoul(i, &j, 10);
++ if (*j != '\0' || j == i || errno) {
++ report(stderr, GT_("Cannot handle UIDL response from upstream server.\n"));
++ return PS_PROTOCOL;
++ }
++ i = strtok(NULL, POSIX_space);
++ strlcpy(id, i, idsize);
++ return PS_SUCCESS;
++}
++
++static int pop3_getuidl(int sock, int num , char *id, size_t idsize)
+ {
+ int ok;
+ char buf [POPBUFSIZE+1];
++ unsigned long gotnum;
++
+ gen_send(sock, "UIDL %d", num);
+ if ((ok = pop3_ok(sock, buf)) != 0)
+ return(ok);
+- if (sscanf(buf, "%d %s", &num, id) != 2)
+- return(PS_PROTOCOL);
++ if ((ok = parseuid(buf, &gotnum, id, idsize)))
++ return ok;
++ if (gotnum != num) {
++ report(stderr, GT_("Server responded with UID for wrong message.\n"));
++ return PS_PROTOCOL;
++ }
+ return(PS_SUCCESS);
+ }
+
+@@ -638,7 +666,7 @@
+ struct idlist *new;
+
+ try_nr = (first_nr + last_nr) / 2;
+- if( (ok = pop3_getuidl( sock, try_nr, id )) != 0 )
++ if ((ok = pop3_getuidl(sock, try_nr, id, sizeof(id))) != 0)
+ return ok;
+ if ((new = str_in_list(&ctl->oldsaved, id, FALSE)))
+ {
+@@ -700,10 +728,10 @@
+ int first_nr, list_len, try_id, try_nr, add_id;
+ int num;
+ char id [IDLEN+1];
+-
+- if( (ok = pop3_gettopid( sock, 1, id )) != 0 )
++
++ if ((ok = pop3_gettopid(sock, 1, id, sizeof(id))) != 0)
+ return ok;
+-
++
+ if( ( first_nr = str_nr_in_list(&ctl->oldsaved, id) ) == -1 ) {
+ /* the first message is unknown -> all messages are new */
+ *newp = *countp;
+@@ -715,7 +743,7 @@
+ try_id = list_len - first_nr; /* -1 + 1 */
+ if( try_id > 1 ) {
+ if( try_id <= *countp ) {
+- if( (ok = pop3_gettopid( sock, try_id, id )) != 0 )
++ if ((ok = pop3_gettopid(sock, try_id, id, sizeof(id))) != 0)
+ return ok;
+
+ try_nr = str_nr_last_in_list(&ctl->oldsaved, id);
+@@ -739,7 +767,7 @@
+ } else
+ try_id += add_id;
+
+- if( (ok = pop3_gettopid( sock, try_id, id )) != 0 )
++ if ((ok = pop3_gettopid(sock, try_id, id, sizeof(id))) != 0)
+ return ok;
+ try_nr = str_nr_in_list(&ctl->oldsaved, id);
+ }
+@@ -801,7 +829,7 @@
+
+ /*
+ * Newer, RFC-1725-conformant POP servers may not have the LAST command.
+- * We work as hard as possible to hide this ugliness, but it makes
++ * We work as hard as possible to hide this ugliness, but it makes
+ * counting new messages intrinsically quadratic in the worst case.
+ */
+ last = 0;
+@@ -839,15 +867,15 @@
+ }
+ *newp = (*countp - last);
+ }
+- else
+- {
++ else
++ {
+ if (dofastuidl)
+ return(pop3_fastuidl( sock, ctl, *countp, newp));
+ /* grab the mailbox's UID list */
+ if ((ok = gen_transact(sock, "UIDL")) != 0)
+ {
+ /* don't worry, yet! do it the slow way */
+- if((ok = pop3_slowuidl( sock, ctl, countp, newp))!=0)
++ if ((ok = pop3_slowuidl(sock, ctl, countp, newp)))
+ {
+ report(stderr, GT_("protocol error while fetching UIDLs\n"));
+ return(PS_ERROR);
+@@ -855,27 +883,32 @@
+ }
+ else
+ {
+- int num;
++ unsigned long unum;
+
+ *newp = 0;
+- while ((ok = gen_recv(sock, buf, sizeof(buf))) == 0)
++ while ((ok = gen_recv(sock, buf, sizeof(buf))) == 0)
+ {
+- if (DOTLINE(buf))
+- break;
+- else if (sscanf(buf, "%d %s", &num, id) == 2)
++ if (DOTLINE(buf))
++ break;
++
++ if (parseuid(buf, &unum, id, sizeof(id)) == PS_SUCCESS)
+ {
+- struct idlist *old, *new;
++ struct idlist *old, *new;
+
+ new = save_str(&ctl->newsaved, id, UID_UNSEEN);
+- new->val.status.num = num;
++ new->val.status.num = unum;
+
+ if ((old = str_in_list(&ctl->oldsaved, id, FALSE)))
+ {
+ flag mark = old->val.status.mark;
+ if (mark == UID_DELETED || mark == UID_EXPUNGED)
+ {
++ /* XXX FIXME: switch 3 occurrences from
++ * (int)unum or (unsigned int)unum to
++ * remove the cast and use %lu - not now
++ * though, time for new release */
+ if (outlevel >= O_VERBOSE)
+- report(stderr, GT_("id=%s (num=%d) was deleted, but is still present!\n"), id, num);
++ report(stderr, GT_("id=%s (num=%d) was deleted, but is still present!\n"), id, (int)unum);
+ /* just mark it as seen now! */
+ old->val.status.mark = mark = UID_SEEN;
+ }
+@@ -884,25 +917,25 @@
+ {
+ (*newp)++;
+ if (outlevel >= O_DEBUG)
+- report(stdout, GT_("%u is unseen\n"), num);
++ report(stdout, GT_("%u is unseen\n"), (unsigned int)unum);
+ }
+ }
+ else
+ {
+ (*newp)++;
+ if (outlevel >= O_DEBUG)
+- report(stdout, GT_("%u is unseen\n"), num);
++ report(stdout, GT_("%u is unseen\n"), (unsigned int)unum);
+ /* add it to oldsaved also! In case, we do not
+ * swap the lists (say, due to socket error),
+ * the same mail will not be downloaded again.
+ */
+ old = save_str(&ctl->oldsaved, id, UID_UNSEEN);
+- old->val.status.num = num;
++ old->val.status.num = unum;
+ }
+ }
+- }
+- }
+- }
++ }
++ }
++ }
+ }
+
+ return(PS_SUCCESS);
+@@ -986,7 +1019,7 @@
+ }
+
+ /* get the uidl first! */
+- if (pop3_getuidl(sock, num, id) != PS_SUCCESS)
++ if (pop3_getuidl(sock, num, id, sizeof(id)) != PS_SUCCESS)
+ return(TRUE);
+
+ if ((new = str_in_list(&ctl->oldsaved, id, FALSE))) {