summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/libc/rpc/svc_tcp.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/lib/libc/rpc/svc_tcp.c b/lib/libc/rpc/svc_tcp.c
index e9bf8d440b0..0fac0993df6 100644
--- a/lib/libc/rpc/svc_tcp.c
+++ b/lib/libc/rpc/svc_tcp.c
@@ -28,7 +28,7 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$OpenBSD: svc_tcp.c,v 1.7 1996/08/20 23:47:46 deraadt Exp $";
+static char *rcsid = "$OpenBSD: svc_tcp.c,v 1.8 1997/02/07 06:27:19 deraadt Exp $";
#endif /* LIBC_SCCS and not lint */
/*
@@ -49,6 +49,10 @@ static char *rcsid = "$OpenBSD: svc_tcp.c,v 1.7 1996/08/20 23:47:46 deraadt Exp
#include <sys/socket.h>
#include <errno.h>
+#include <netinet/in_systm.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+
/*
* Ops vector for TCP/IP based rpc service handle
*/
@@ -241,6 +245,28 @@ rendezvous_request(xprt)
goto again;
return (FALSE);
}
+
+#ifdef IP_OPTIONS
+ {
+ u_char optbuf[BUFSIZ/3];
+ int optsize = sizeof(optbuf), i;
+
+ if (!getsockopt(sock, IPPROTO_IP, IP_OPTIONS, (char *)optbuf,
+ &optsize) && optsize != 0) {
+ for (i = 0; i < optsize; ) {
+ u_char c = optbuf[i];
+ if (c == IPOPT_LSRR || c == IPOPT_SSRR) {
+ close(sock);
+ goto again;
+ }
+ if (c == IPOPT_EOL)
+ break;
+ i += (c == IPOPT_NOP) ? 1 : optbuf[i+1];
+ }
+ }
+ }
+#endif
+
/*
* XXX careful for ftp bounce attacks. If discovered, close the
* socket and look for another connection.
@@ -249,6 +275,7 @@ rendezvous_request(xprt)
close(sock);
goto again;
}
+
/*
* make a new transporter (re-uses xprt)
*/