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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 Vww~v|H73&avS0+l_@2Wl{|kdtHEaL? delta 11821 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