From 71c6ec71e5cb5014eb77391856bf55c7caa28ff3 Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Tue, 13 Oct 2015 19:27:19 -0400 Subject: [PATCH] connect() now checks socket family --- netcon/NetconEthernetTap.cpp | 8 ++++---- netcon/intercept.c | 11 ++++++++--- netcon/libintercept.so.1.0 | Bin 53656 -> 53768 bytes 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/netcon/NetconEthernetTap.cpp b/netcon/NetconEthernetTap.cpp index 0921f4602..5fae57859 100644 --- a/netcon/NetconEthernetTap.cpp +++ b/netcon/NetconEthernetTap.cpp @@ -951,7 +951,7 @@ void NetconEthernetTap::handle_listen(PhySocket *sock, void **uptr, struct liste [I] EINVAL - Unknown protocol, or protocol family not available. [I] EINVAL - Invalid flags in type. [I] EMFILE - Process file table overflow. - [i] ENFILE - The system limit on the total number of open files has been reached. + [?] ENFILE - The system limit on the total number of open files has been reached. [X] ENOBUFS or ENOMEM - Insufficient memory is available. The socket cannot be created until sufficient resources are freed. [?] EPROTONOSUPPORT - The protocol type or the specified protocol is not supported within this domain. @@ -1004,10 +1004,10 @@ void NetconEthernetTap::handle_socket(PhySocket *sock, void **uptr, struct socke - := Not needed [-] EACCES - For UNIX domain sockets, which are identified by pathname: Write permission is denied ... - [ ] EACCES, EPERM - The user tried to connect to a broadcast address without having the socket broadcast flag enabled ... + [?] EACCES, EPERM - The user tried to connect to a broadcast address without having the socket broadcast flag enabled ... [i] EADDRINUSE - Local address is already in use. - [?] EAFNOSUPPORT - The passed address didn't have the correct address family in its sa_family field. - [ ] EAGAIN - No more free local ports or insufficient entries in the routing cache. + [I] EAFNOSUPPORT - The passed address didn't have the correct address family in its sa_family field. + [?] EAGAIN - No more free local ports or insufficient entries in the routing cache. [ ] EALREADY - The socket is nonblocking and a previous connection attempt has not yet been completed. [I] EBADF - The file descriptor is not a valid index in the descriptor table. [ ] ECONNREFUSED - No-one listening on the remote address. diff --git a/netcon/intercept.c b/netcon/intercept.c index 4762b3091..4e87e36ae 100755 --- a/netcon/intercept.c +++ b/netcon/intercept.c @@ -607,6 +607,9 @@ int socket(SOCKET_SIG) connect() intercept function */ int connect(CONNECT_SIG) { + struct sockaddr_in *connaddr; + connaddr = (struct sockaddr_in *) __addr; + #ifdef CHECKS /* Check that this is a valid fd */ if(fcntl(__fd, F_GETFD) < 0) { @@ -620,6 +623,11 @@ int connect(CONNECT_SIG) errno = ENOTSOCK; return -1; } + /* Check family */ + if (connaddr->sin_family < 0 || connaddr->sin_family >= NPROTO){ + errno = EAFNOSUPPORT; + return -1; + } /* FIXME: Check that address is in user space, return EFAULT ? */ #endif @@ -637,9 +645,6 @@ int connect(CONNECT_SIG) return(realconnect(__fd, __addr, __len)); } - struct sockaddr_in *connaddr; - connaddr = (struct sockaddr_in *) __addr; - if(__addr != NULL && (connaddr->sin_family == AF_LOCAL || connaddr->sin_family == PF_NETLINK || connaddr->sin_family == AF_NETLINK diff --git a/netcon/libintercept.so.1.0 b/netcon/libintercept.so.1.0 index 106c8c2061593866f0a44017a60d57438eff05b8..dc8ca9dc2f89693a16dddcec8d6b0f5a9d8f24cf 100755 GIT binary patch delta 11904 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

DJy&Bzb{_b*rh zth0L@p#biCkb-(xXKfGETt!$PfymkTIrNA=u0cK{9Ld z+{KbcnEC>-=?g^Yn{2RAN*1PV8{FwZFy=AU$p$NBCjZ;Ok@gxc8wz92hW2C_8G>QV zolqf&UtzqNf{R0yIF#uJ+SaibK-y83%?>q2169H4IF!5!|x zxdyK5VInY>a)Js%ND~1j1amJpNNVEKa&Y?rCJ3_|Ecux+WIm_?0TWycwRUstW`0(w z5NMjb4y9o!carMlL`E^Ga;Pv&8lG;!(v#2Z;9wNme09e;#>q=|eKE9vHhGcLBQpaJ ze6cgCI4{GC$s2czZoaqs6pJJ*9l^#c6qz8)ofk|#cmT9;ne$*dW5VXfgW^n@umRHV z%n&88rVec6_a9VTVDiDk;*1KDZyw&ys4#iv5qCy|%@2$w?RO7$qhzylBt0;Rr;<3zo@Rr{w^N=N^9m