From 5dffa432016d32e3b633390589af4dccaded67d5 Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Mon, 12 Oct 2015 19:29:27 -0400 Subject: [PATCH] Additional retval+errno handling --- ext/lwipopts.h | 2 +- make-netcon.mk | 29 ------------ netcon/NetconEthernetTap.cpp | 88 +++++++++++++++++++++++++---------- netcon/NetconEthernetTap.hpp | 1 + netcon/intercept.c | 49 ++++++++++++------- netcon/libintercept.so.1.0 | Bin 51688 -> 52032 bytes 6 files changed, 98 insertions(+), 71 deletions(-) delete mode 100644 make-netcon.mk diff --git a/ext/lwipopts.h b/ext/lwipopts.h index 7a75e79bb..e7b78a8fc 100644 --- a/ext/lwipopts.h +++ b/ext/lwipopts.h @@ -130,7 +130,7 @@ * MEMP_NUM_RAW_PCB: Number of raw connection PCBs * (requires the LWIP_RAW option) */ -#define MEMP_NUM_RAW_PCB 32 +#define MEMP_NUM_RAW_PCB 128 /** * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One diff --git a/make-netcon.mk b/make-netcon.mk deleted file mode 100644 index 2aa797ddf..000000000 --- a/make-netcon.mk +++ /dev/null @@ -1,29 +0,0 @@ -SHCC=gcc - -# intercept-specific -intercept_CFLAGS = -c -fPIC -g -O2 -Wall -std=c99 -D_GNU_SOURCE -DNETCON_INTERCEPT -LIB_NAME = intercept -SHLIB_EXT=dylib -SHLIB_MAJOR = 1 -SHLIB_MINOR = 8 -COMMON = common -OBJS= netcon/intercept.o -SHLIB = ${LIB_NAME}.${SHLIB_EXT}.${SHLIB_MAJOR}.${SHLIB_MINOR} -SHLDFLAGS = -g -O2 -Wall -I. -nostdlib -shared -LIBS = -ldl -lc -lrt -lpthread - -lib: - ${SHCC} $(intercept_CFLAGS) -I. netcon/intercept.c -o netcon/intercept.o - ${SHCC} $(intercept_CFLAGS) -I. netcon/common.c -o netcon/common.o - ${SHCC} $(intercept_CFLAGS) -I. netcon/sendfd.c -o netcon/sendfd.o - ${SHCC} $(SHLDFLAGS) netcon/intercept.o netcon/common.o netcon/sendfd.o -o netcon/libintercept.so.1.0 $(LIBS) - -install: - cp netcon/libintercept.so.1.0 /lib/libintercept.so.1.0 - ln -sf /lib/libintercept.so.1.0 /lib/libintercept - /usr/bin/install -c netcon/intercept /usr/bin - -uninstall: - rm -r /lib/libintercept.so.1.0 - rm -r /lib/libintercept - rm -r /usr/bin/intercept diff --git a/netcon/NetconEthernetTap.cpp b/netcon/NetconEthernetTap.cpp index 276d481a8..53dfe3f03 100644 --- a/netcon/NetconEthernetTap.cpp +++ b/netcon/NetconEthernetTap.cpp @@ -446,21 +446,29 @@ void NetconEthernetTap::phyOnUnixData(PhySocket *sock,void **uptr,void *data,uns * Send a return value to the client for an RPC */ int NetconEthernetTap::send_return_value(TcpConnection *conn, int retval, int _errno = 0) +{ + if(conn) { + int n = send_return_value(_phy.getDescriptor(conn->rpcSock), retval, _errno); + if(n > 0) + conn->pending = false; + else { + fprintf(stderr, "Unable to send return value to the intercept. Closing connection\n"); + closeConnection(conn); + } + return n; + } + return -1; +} + +int NetconEthernetTap::send_return_value(int fd, int retval, int _errno = 0) { int sz = sizeof(char) + sizeof(retval) + sizeof(errno); - char retmsg[sz]; - memset(&retmsg, '\0', sizeof(retmsg)); - retmsg[0]=RPC_RETVAL; + char retmsg[sz]; + memset(&retmsg, '\0', sizeof(retmsg)); + retmsg[0]=RPC_RETVAL; memcpy(&retmsg[1], &retval, sizeof(retval)); memcpy(&retmsg[1]+sizeof(retval), &_errno, sizeof(_errno)); - int n = write(_phy.getDescriptor(conn->rpcSock), &retmsg, sz); - if(n > 0) - conn->pending = false; - else { - fprintf(stderr, "Unable to send return value to the intercept. Closing connection\n"); - closeConnection(conn); - } - return n; + return write(fd, &retmsg, sz); } /*------------------------------------------------------------------------------ @@ -484,6 +492,24 @@ int NetconEthernetTap::send_return_value(TcpConnection *conn, int retval, int _e * @param newly allocated PCB * @param error code * @return ERR_OK if everything is ok, -1 otherwise + + [ ] EAGAIN or EWOULDBLOCK - The socket is marked nonblocking and no connections are present + to be accepted. POSIX.1-2001 allows either error to be returned for + this case, and does not require these constants to have the same value, + so a portable application should check for both possibilities. + [ ] EBADF - The descriptor is invalid. + [?] ECONNABORTED - A connection has been aborted. + [ ] EFAULT - The addr argument is not in a writable part of the user address space. + [ ] EINTR - The system call was interrupted by a signal that was caught before a valid connection arrived; see signal(7). + [ ] EINVAL - Socket is not listening for connections, or addrlen is invalid (e.g., is negative). + [ ] EINVAL - (accept4()) invalid value in flags. + [ ] EMFILE - The per-process limit of open file descriptors has been reached. + [ ] ENFILE - The system limit on the total number of open files has been reached. + [ ] ENOBUFS, ENOMEM - Not enough free memory. This often means that the memory allocation is limited by the socket buffer limits, not by the system memory. + [ ] ENOTSOCK - The descriptor references a file, not a socket. + [ ] EOPNOTSUPP - The referenced socket is not of type SOCK_STREAM. + [ ] EPROTO - Protocol error. + * */ err_t NetconEthernetTap::nc_accept(void *arg, struct tcp_pcb *newpcb, err_t err) @@ -507,11 +533,10 @@ err_t NetconEthernetTap::nc_accept(void *arg, struct tcp_pcb *newpcb, err_t err) int send_fd = tap->_phy.getDescriptor(conn->rpcSock); - int n = write(larg_fd, "z", 1); + int n = write(larg_fd, "z", 1); // accept() in library waits for this byte if(n > 0) { if(sock_fd_write(send_fd, fds[1]) > 0) { new_tcp_conn->pending = true; - fprintf(stderr, "nc_accept(): socketpair = { our=%d, their=%d}\n", fds[0], fds[1]); } else { fprintf(stderr, "nc_accept(%d): unable to send fd to client\n", larg_fd); @@ -526,7 +551,7 @@ err_t NetconEthernetTap::nc_accept(void *arg, struct tcp_pcb *newpcb, err_t err) tap->lwipstack->_tcp_err(newpcb, nc_err); tap->lwipstack->_tcp_sent(newpcb, nc_sent); tap->lwipstack->_tcp_poll(newpcb, nc_poll, 0.5); - tcp_accepted(conn->pcb); + tcp_accepted(conn->pcb); // Let lwIP know that it can queue additional incoming connections return ERR_OK; } else { @@ -691,8 +716,6 @@ err_t NetconEthernetTap::nc_connected(void *arg, struct tcp_pcb *tpcb, err_t err * @param structure containing the data and parameters for this client's RPC * - TODO: set errno appropriately - [ ] EACCES - The address is protected, and the user is not the superuser. [X] EADDRINUSE - The given address is already in use. [X] EBADF - sockfd is not a valid descriptor. @@ -718,7 +741,6 @@ void NetconEthernetTap::handle_bind(PhySocket *sock, void **uptr, struct bind_st int conn_port = lwipstack->ntohs(connaddr->sin_port); ip_addr_t conn_addr; conn_addr.addr = *((u32_t *)_ips[0].rawIpData()); - TcpConnection *conn = getConnectionByTheirFD(bind_rpc->sockfd); if(conn) { @@ -738,14 +760,18 @@ void NetconEthernetTap::handle_bind(PhySocket *sock, void **uptr, struct bind_st send_return_value(conn, -1, ENOMEM); } else { - send_return_value(conn, ERR_OK, 0); // OK + send_return_value(conn, ERR_OK, ERR_OK); // Success } } - else fprintf(stderr, "handle_bind(): PCB not in CLOSED state. Ignoring BIND request.\n"); - send_return_value(conn, -1, EINVAL); + else { + fprintf(stderr, "handle_bind(): PCB not in CLOSED state. Ignoring BIND request.\n"); + send_return_value(conn, -1, EINVAL); + } } - else fprintf(stderr, "handle_bind(): can't locate connection for PCB\n"); - send_return_value(conn, -1, EBADF); + else { + fprintf(stderr, "handle_bind(): can't locate connection for PCB\n"); + send_return_value(conn, -1, EBADF); // FIXME: This makes no sense + } } /* @@ -754,6 +780,12 @@ void NetconEthernetTap::handle_bind(PhySocket *sock, void **uptr, struct bind_st * @param Client that is making the RPC * @param structure containing the data and parameters for this client's RPC * + + [ ] EADDRINUSE - Another socket is already listening on the same port. + [X] EBADF - The argument sockfd is not a valid descriptor. + [ ] ENOTSOCK - The argument sockfd is not a socket. + [ ] EOPNOTSUPP - The socket is not of a type that supports the listen() operation. + */ void NetconEthernetTap::handle_listen(PhySocket *sock, void **uptr, struct listen_st *listen_rpc) { @@ -771,13 +803,16 @@ void NetconEthernetTap::handle_listen(PhySocket *sock, void **uptr, struct liste /* we need to wait for the client to send us the fd allocated on their end for this listening socket */ conn->pending = true; + send_return_value(conn, ERR_OK, ERR_OK); } else { fprintf(stderr, "handle_listen(): unable to allocate memory for new listening PCB\n"); + send_return_value(conn, -1, ENOMEM); // FIXME: This does not have an equivalent errno value } } else { fprintf(stderr, "handle_listen(): can't locate connection for PCB\n"); + send_return_value(conn, -1, EBADF); } } @@ -838,13 +873,16 @@ void NetconEthernetTap::handle_socket(PhySocket *sock, void **uptr, struct socke new_conn->their_fd = fds[1]; tcp_connections.push_back(new_conn); sock_fd_write(_phy.getDescriptor(sock), fds[1]); - //fprintf(stderr, "handle_socket(): socketpair = { our=%d, their=%d}\n", fds[0], fds[1]); - /* Once the client tells us what its fd is for the other end, - we can then complete the mapping */ + // Once the client tells us what its fd is for the other end, we can then complete the mapping new_conn->pending = true; } else { + int rpc_fd = _phy.getDescriptor(sock); + sock_fd_write(rpc_fd, -1); // Send a bad fd, to signal error fprintf(stderr, "handle_socket(): Memory not available for new PCB\n"); + if(send_return_value(rpc_fd, -1, ENOMEM) < 0) { + fprintf(stderr, "handle_socket(): Unable to send return value\n"); + } } } diff --git a/netcon/NetconEthernetTap.hpp b/netcon/NetconEthernetTap.hpp index 978c44970..6bf2596e0 100644 --- a/netcon/NetconEthernetTap.hpp +++ b/netcon/NetconEthernetTap.hpp @@ -112,6 +112,7 @@ private: void handle_write(TcpConnection *conn); int send_return_value(TcpConnection *conn, int retval, int _errno); + int send_return_value(int fd, int retval, int _errno); void phyOnDatagram(PhySocket *sock,void **uptr,const struct sockaddr *from,void *data,unsigned long len); void phyOnTcpConnect(PhySocket *sock,void **uptr,bool success); diff --git a/netcon/intercept.c b/netcon/intercept.c index b3e919059..df2dc7cfc 100755 --- a/netcon/intercept.c +++ b/netcon/intercept.c @@ -121,6 +121,8 @@ it conflicts with our overriden symbols for read/write */ #define BUF_SZ 1024 #define SERVICE_CONNECT_ATTEMPTS 30 +#define ERR_OK 0 + ssize_t sock_fd_read(int sock, void *buf, ssize_t bufsize, int *fd); /* threading */ @@ -535,20 +537,30 @@ int socket(SOCKET_SIG) ssize_t size = sock_fd_read(fdret_sock, gmybuf, sizeof(gmybuf), &newfd); if(size > 0) { - dwr("socket(): RXed FD = %d\n", newfd); /* send our local-fd number back to service so it can complete its mapping table entry */ memset(cmd, '\0', BUF_SZ); cmd[0] = RPC_FD_MAP_COMPLETION; memcpy(&cmd[1], &newfd, sizeof(newfd)); - write(fdret_sock, cmd, BUF_SZ); - pthread_mutex_unlock(&lock); - return newfd; + if(newfd > -1) { + int n_write = write(fdret_sock, cmd, BUF_SZ); + if(n_write < 0) { + dwr("Error writing perceived FD to service.\n"); + return get_retval(); + } + pthread_mutex_unlock(&lock); + errno = ERR_OK; + return newfd; + } + else { // Try to read retval+errno since we RXed a bad fd + dwr("Error, service sent bad fd.\n"); + return get_retval(); + } } else { dwr("Error while receiving new FD.\n"); pthread_mutex_unlock(&lock); - return -1; + return get_retval(); } return realsocket(socket_family, socket_type, protocol); #endif @@ -704,7 +716,7 @@ int bind(BIND_SIG) pthread_mutex_lock(&lock); write(fdret_sock, cmd, BUF_SZ); pthread_mutex_unlock(&lock); - + errno = ERR_OK; return get_retval(); #endif } @@ -769,24 +781,31 @@ int accept(ACCEPT_SIG) ssize_t size = sock_fd_read(fdret_sock, gmybuf, sizeof(gmybuf), &new_conn_socket); if(size > 0) { - dwr("accept(): RXed FD = %d\n", new_conn_socket); /* Send our local-fd number back to service so it can complete its mapping table */ memset(cmd, '\0', BUF_SZ); cmd[0] = RPC_FD_MAP_COMPLETION; memcpy(&cmd[1], &new_conn_socket, sizeof(new_conn_socket)); pthread_mutex_lock(&lock); - write(fdret_sock, cmd, BUF_SZ); + int n_write = write(fdret_sock, cmd, BUF_SZ); + if(n_write < 0) { + dwr("Error sending perceived FD to service. Service might be down.\n"); + errno = ECONNABORTED; + return -1; + } pthread_mutex_unlock(&lock); - return new_conn_socket; + errno = ERR_OK; + return new_conn_socket; // OK } else { - dwr("Error while receiving new FD.\n"); + dwr("Error receiving new FD from service. Service might be down.\n"); + errno = ECONNABORTED; return -1; } } - errno = EWOULDBLOCK; + dwr("Error reading signal byte from service. Service might be down.\n"); + //errno = EWOULDBLOCK; + errno = ECONNABORTED; return -1; - /* TODO/FIXME: Set errno */ #endif } @@ -822,9 +841,7 @@ int listen(LISTEN_SIG) pthread_mutex_lock(&lock); write(fdret_sock,cmd, BUF_SZ); pthread_mutex_unlock(&lock); - - return 0; - /* FIXME: get real return value (should be 0 / -1) */ - /* FIXME: Also set errno */ + errno = ERR_OK; + return get_retval(); #endif } diff --git a/netcon/libintercept.so.1.0 b/netcon/libintercept.so.1.0 index f4034ee29a0d2e4ff6cb511d4bd78c1e8ca41f65..e50a40c21b7699bf2d5c6087bde35036e95049b6 100755 GIT binary patch literal 52032 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 literal 51688 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