summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart Henderson <sthen@cvs.openbsd.org>2012-07-11 09:43:11 +0000
committerStuart Henderson <sthen@cvs.openbsd.org>2012-07-11 09:43:11 +0000
commitec5a5808178841e2ba2ba3b8542340bfede603b2 (patch)
tree2beebd3196c408042220edbe685d92a118129e50
parentde65d75fddef912dd9d853633af368812c9cfc4e (diff)
Limit "while(setsockopt(..SO_RCVBUF/SO_SNDBUF..))" loops to prevent them
running away if the setsockopt call fails, as may happen if a peer bounces at the wrong time. OK claudio@ after tweaks to an earlier version which was OK phessler@.
-rw-r--r--usr.sbin/bgpd/session.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/usr.sbin/bgpd/session.c b/usr.sbin/bgpd/session.c
index 8a511339e4e..22d863be1ec 100644
--- a/usr.sbin/bgpd/session.c
+++ b/usr.sbin/bgpd/session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.c,v 1.322 2012/07/09 11:11:07 claudio Exp $ */
+/* $OpenBSD: session.c,v 1.323 2012/07/11 09:43:10 sthen Exp $ */
/*
* Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org>
@@ -1211,12 +1211,14 @@ session_setup_socket(struct peer *p)
if (p->conf.auth.method != AUTH_NONE) {
/* try to increase bufsize. no biggie if it fails */
bsize = 65535;
- while (setsockopt(p->fd, SOL_SOCKET, SO_RCVBUF, &bsize,
- sizeof(bsize)) == -1)
+ while (bsize > 8192 &&
+ setsockopt(p->fd, SOL_SOCKET, SO_RCVBUF, &bsize,
+ sizeof(bsize)) == -1 && errno != EINVAL)
bsize /= 2;
bsize = 65535;
- while (setsockopt(p->fd, SOL_SOCKET, SO_SNDBUF, &bsize,
- sizeof(bsize)) == -1)
+ while (bsize > 8192 &&
+ setsockopt(p->fd, SOL_SOCKET, SO_SNDBUF, &bsize,
+ sizeof(bsize)) == -1 && errno != EINVAL)
bsize /= 2;
}