added language and platform checks for recvfrom/sendto address castings

This commit is contained in:
Joseph Henry
2016-12-14 16:23:23 -08:00
parent c2d59c6545
commit 76e8c2e187
8 changed files with 54 additions and 37 deletions

View File

@@ -222,13 +222,16 @@ linux_service_and_intercept: linux_intercept linux_sdk_service
# Builds a single shared library which contains everything # Builds a single shared library which contains everything
linux_shared_lib: pico $(OBJS) linux_shared_lib: pico $(OBJS)
$(CXX) $(CXXFLAGS) $(STACK_FLAGS) $(DEFS) $(INCLUDES) $(ZTFLAGS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED -DSDK_DEBUG -DSDK_PICOTCP -DSDK_IPV4 $(PICO_DRIVER_FILES) $(SDK_INTERCEPT_C_FILES) $(SDK_SERVICE_CPP_FILES) src/service.cpp -c $(CXX) $(CXXFLAGS) $(STACK_FLAGS) $(DEFS) $(INCLUDES) $(ZTFLAGS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED $(PICO_DRIVER_FILES) $(SDK_INTERCEPT_C_FILES) $(SDK_SERVICE_CPP_FILES) src/service.cpp -c
ar -rcs libzt.a picotcp.o proxy.o tap.o one.o OneService.o service.o sockets.o rpc.o intercept.o OneService.o $(OBJS) ar -rcs build/libzt.a picotcp.o proxy.o tap.o one.o OneService.o service.o sockets.o rpc.o intercept.o OneService.o $(OBJS)
# Builds zt-embedded tests # Builds zts_* library tests
linux_shared_lib_tests: linux_shared_lib_tests:
$(CXX) -DSDK_SERVICE -DSDK -DSDK_BUNDLED -DSDK_DEBUG -DSDK_PICOTCP -DSDK_IPV4 $(CXXFLAGS) $(LDFLAGS) $(INCLUDES) -Isrc tests/api_test/zt_tcpserver4.c -o zt_tcpserver4.out -L. -lzt -ldl mkdir -p $(TEST_OBJDIR)
$(CXX) -DSDK_SERVICE -DSDK -DSDK_BUNDLED -DSDK_DEBUG -DSDK_PICOTCP -DSDK_IPV4 -DSDK_DEBUG $(CXXFLAGS) $(LDFLAGS) $(INCLUDES) -Isrc tests/api_test/zt_tcpclient4.c -o zt_tcpclient4.out -L. -lzt -ldl $(CXX) $(CXXFLAGS) $(LDFLAGS) $(INCLUDES) $(STACK_FLAGS) $(DEFS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED -Isrc tests/shared_test/zts.tcpserver4.c -o $(TEST_OBJDIR)/$(OSTYPE).zts.tcpserver4.out -Lbuild -lzt -ldl
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(INCLUDES) $(STACK_FLAGS) $(DEFS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED -Isrc tests/shared_test/zts.tcpclient4.c -o $(TEST_OBJDIR)/$(OSTYPE).zts.tcpclient4.out -Lbuild -lzt -ldl
# -------- ANDROID --------- # -------- ANDROID ---------
# TODO: CHECK if ANDROID/GRADLE TOOLS are installed # TODO: CHECK if ANDROID/GRADLE TOOLS are installed

View File

@@ -37,9 +37,9 @@ SDK_SERVICE_CPP_FILES:=src/tap.cpp \
$(ZT1)/one.cpp $(ZT1)/one.cpp
SDK_SERVICE_C_FILES = src/rpc.c SDK_SERVICE_C_FILES = src/rpc.c
SDK_INTERCEPT_C_FILES:=sockets.c \ SDK_INTERCEPT_C_FILES:=src/sockets.c \
intercept.c \ src/intercept.c \
rpc.c src/rpc.c
ZTFLAGS:=-DSDK -DZT_ONE_NO_ROOT_CHECK ZTFLAGS:=-DSDK -DZT_ONE_NO_ROOT_CHECK
@@ -221,18 +221,9 @@ remove_only_intermediates:
-find . -type f \( -name '*.o' -o -name '*.so' \) -delete -find . -type f \( -name '*.o' -o -name '*.so' \) -delete
# Builds a single shared library which contains everything
ifeq ($(SDK_LWIP),1)
osx_shared_lib: lwip $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(STACK_FLAGS) $(INCLUDES) $(ZTFLAGS) -DSDK_INTERCEPT -shared -o $(SHARED_LIB) $(OBJS) $(LWIP_DRIVER_FILES) $(SDK_SERVICE_CPP_FILES) $(SDK_SERVICE_C_FILES) $(LDLIBS) -ldl
else
osx_shared_lib: pico $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(STACK_FLAGS) $(INCLUDES) $(ZTFLAGS) -DSDK_INTERCEPT -shared -o $(SHARED_LIB) $(OBJS) $(PICO_DRIVER_FILES) $(SDK_SERVICE_CPP_FILES) $(SDK_SERVICE_C_FILES) $(LDLIBS) -ldl
endif
osx_intercept: osx_intercept:
# Use gcc not clang to build standalone intercept library since gcc is typically used for libc and we want to ensure maximal ABI compatibility # Use gcc not clang to build standalone intercept library since gcc is typically used for libc and we want to ensure maximal ABI compatibility
cd src ; gcc $(DEFS) $(INCLUDES) -g -O2 -Wall -std=c99 -fPIC -DVERBOSE -D_GNU_SOURCE -DSDK_INTERCEPT -nostdlib -nostdlib -shared -o ../$(INTERCEPT) $(SDK_INTERCEPT_C_FILES) -ldl gcc $(DEFS) $(INCLUDES) -g -O2 -Wall -std=c99 -fPIC -DVERBOSE -D_GNU_SOURCE -DSDK_INTERCEPT -nostdlib -nostdlib -shared -o $(INTERCEPT) $(SDK_INTERCEPT_C_FILES) -ldl
# Build only the SDK service # Build only the SDK service
@@ -250,6 +241,18 @@ endif
# Build both intercept library and SDK service (separate) # Build both intercept library and SDK service (separate)
osx_service_and_intercept: osx_intercept osx_sdk_service osx_service_and_intercept: osx_intercept osx_sdk_service
# Builds a single shared library which contains everything
osx_shared_lib: pico $(OBJS)
$(CXX) $(CXXFLAGS) $(STACK_FLAGS) $(DEFS) $(INCLUDES) $(ZTFLAGS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED $(PICO_DRIVER_FILES) $(SDK_INTERCEPT_C_FILES) $(SDK_SERVICE_CPP_FILES) src/service.cpp -c
libtool -static -o build/libzt.a zerotierone/node/IncomingPacket.o picotcp.o proxy.o tap.o one.o OneService.o service.o sockets.o rpc.o intercept.o OneService.o $(OBJS)
# Builds zts_* library tests
osx_shared_lib_tests:
mkdir -p $(TEST_OBJDIR)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(INCLUDES) $(STACK_FLAGS) $(DEFS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED -Isrc tests/shared_test/zts.tcpserver4.c -o $(TEST_OBJDIR)/$(OSTYPE).zts.tcpserver4.out -Lbuild -lzt -ldl
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(INCLUDES) $(STACK_FLAGS) $(DEFS) -DSDK_SERVICE -DSDK -DSDK_BUNDLED -Isrc tests/shared_test/zts.tcpclient4.c -o $(TEST_OBJDIR)/$(OSTYPE).zts.tcpclient4.out -Lbuild -lzt -ldl
# -------- ANDROID --------- # -------- ANDROID ---------

View File

@@ -48,7 +48,7 @@
#include <pthread.h> #include <pthread.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> //#include <sys/socket.h>
#include <sys/poll.h> #include <sys/poll.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netinet/in.h> #include <netinet/in.h>
@@ -254,7 +254,15 @@ int (*realclose)(CLOSE_SIG);
memcpy(p, iov[i].iov_base, iov[i].iov_len); memcpy(p, iov[i].iov_base, iov[i].iov_len);
p += iov[i].iov_len; p += iov[i].iov_len;
} }
//err = sendto(fd, buf, tot_len, flags, msg->msg_name, msg->msg_namelen); #if defined(__cplusplus)
#if defined(__APPLE__)
err = sendto(fd, buf, tot_len, flags, (const struct sockaddr *)(msg->msg_name), msg->msg_namelen);
#elif defined (__linux__)
err = sendto(fd, buf, tot_len, flags, (__CONST_SOCKADDR_ARG)(msg->msg_name), msg->msg_namelen);
#endif
#else
err = sendto(fd, buf, tot_len, flags, msg->msg_name, msg->msg_namelen);
#endif
free(buf); free(buf);
return err; return err;
} }
@@ -303,7 +311,6 @@ int (*realclose)(CLOSE_SIG);
// TODO: case for address size mismatch? // TODO: case for address size mismatch?
memcpy(addr, tmpbuf, *addrlen); memcpy(addr, tmpbuf, *addrlen);
memcpy(&tmpsz, tmpbuf + sizeof(struct sockaddr_storage), sizeof(tmpsz)); memcpy(&tmpsz, tmpbuf + sizeof(struct sockaddr_storage), sizeof(tmpsz));
char body[2800];
payload_offset = sizeof(int) + sizeof(struct sockaddr_storage); payload_offset = sizeof(int) + sizeof(struct sockaddr_storage);
memcpy(buf, tmpbuf + payload_offset, ZT_MAX_MTU-payload_offset); memcpy(buf, tmpbuf + payload_offset, ZT_MAX_MTU-payload_offset);
} }
@@ -338,7 +345,15 @@ int (*realclose)(CLOSE_SIG);
errno = ENOMEM; errno = ENOMEM;
return -1; return -1;
} }
//n = err = recvfrom(fd, buf, tot_len, flags, msg->msg_name, &msg->msg_namelen); #if defined(__cplusplus)
#if defined(__APPLE__)
n = err = recvfrom(fd, buf, tot_len, flags, (struct sockaddr * __restrict)(msg->msg_name), &msg->msg_namelen);
#elif defined(__linux__)
n = err = recvfrom(fd, buf, tot_len, flags, (__SOCKADDR_ARG)(msg->msg_name), &msg->msg_namelen);
#endif
#else
n = err = recvfrom(fd, buf, tot_len, flags, msg->msg_name, &msg->msg_namelen);
#endif
p = buf; p = buf;
// According to: http://pubs.opengroup.org/onlinepubs/009695399/functions/recvmsg.html // According to: http://pubs.opengroup.org/onlinepubs/009695399/functions/recvmsg.html

View File

@@ -171,9 +171,11 @@ namespace ZeroTier {
#elif defined(__linux__) && !defined(SDK_BUNDLED) #elif defined(__linux__) && !defined(SDK_BUNDLED)
#define __DYNAMIC_STACK__ #define __DYNAMIC_STACK__
// Dynamically load stack library // Dynamically load stack library
DEBUG_ATTN("loading network stack library (%s)", path);
_libref = dlmopen(LM_ID_NEWLM, path, RTLD_NOW); _libref = dlmopen(LM_ID_NEWLM, path, RTLD_NOW);
#elif defined(__linux__) && defined(SDK_BUNDLED) // TODO: Determine why __STATIC_STACK__ won't work in SDK_BUNDLED mode #elif defined(__linux__) && defined(SDK_BUNDLED) // TODO: Determine why __STATIC_STACK__ won't work in SDK_BUNDLED mode
#define __DYNAMIC_STACK__ #define __DYNAMIC_STACK__
DEBUG_ATTN("loading network stack library (%s)", path);
_libref = dlmopen(LM_ID_NEWLM, path, RTLD_NOW); _libref = dlmopen(LM_ID_NEWLM, path, RTLD_NOW);
#elif defined(__APPLE__) #elif defined(__APPLE__)
#include "TargetConditionals.h" #include "TargetConditionals.h"
@@ -185,9 +187,12 @@ namespace ZeroTier {
#elif TARGET_OS_MAC && !defined(SDK_BUNDLED) #elif TARGET_OS_MAC && !defined(SDK_BUNDLED)
#define __DYNAMIC_STACK__ #define __DYNAMIC_STACK__
// Dynamically load stack library // Dynamically load stack library
DEBUG_ATTN("loading network stack library (%s)", path);
_libref = dlopen(path, RTLD_NOW); _libref = dlopen(path, RTLD_NOW);
#else #else
#define __STATIC_STACK__ #define __DYNAMIC_STACK__ // should be switched to __STATIC_STACK__
DEBUG_ATTN("loading network stack library (%s)", path);
_libref = dlopen(path, RTLD_NOW);
#endif #endif
#endif #endif

View File

@@ -140,7 +140,6 @@ NetconEthernetTap::NetconEthernetTap(
Utils::snprintf(stackPath,sizeof(stackPath),"%s%slibjip.so",homePath,ZT_PATH_SEPARATOR_S); Utils::snprintf(stackPath,sizeof(stackPath),"%s%slibjip.so",homePath,ZT_PATH_SEPARATOR_S);
jipstack = new jip_stack(stackPath); jipstack = new jip_stack(stackPath);
#endif #endif
_unixListenSocket = _phy.unixListen(sockPath,(void *)this); _unixListenSocket = _phy.unixListen(sockPath,(void *)this);
chmod(sockPath, 0777); // To make the RPC socket available to all users chmod(sockPath, 0777); // To make the RPC socket available to all users

View File

@@ -15,12 +15,9 @@ int main(int argc , char *argv[])
return 0; return 0;
} }
int sock, client_sock, c, read_size, port = atoi(argv[1]); int comm_fd, sock, client_sock, c, read_size, port = atoi(argv[1]);
char client_message[2000]; char client_message[2000];
char str[100];
int comm_fd;
struct sockaddr_in servaddr; struct sockaddr_in servaddr;
struct sockaddr_in client; struct sockaddr_in client;

View File

@@ -2,7 +2,6 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <unistd.h> #include <unistd.h>
@@ -25,7 +24,7 @@ int main(int argc , char *argv[])
int sock, port = atoi(argv[2]); int sock, port = atoi(argv[2]);
struct sockaddr_in server; struct sockaddr_in server;
char message[MSG_SZ] , server_reply[MSG_SZ]; char server_reply[MSG_SZ];
sock = zts_socket(AF_INET , SOCK_STREAM , 0); sock = zts_socket(AF_INET , SOCK_STREAM , 0);
if (sock == -1) { if (sock == -1) {

View File

@@ -2,7 +2,6 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <unistd.h> #include <unistd.h>
@@ -22,9 +21,6 @@ int main(int argc , char *argv[])
int sock, client_sock, c, read_size, port = atoi(argv[1]); int sock, client_sock, c, read_size, port = atoi(argv[1]);
char client_message[2000]; char client_message[2000];
char str[100];
int comm_fd;
struct sockaddr_in servaddr; struct sockaddr_in servaddr;
struct sockaddr_in client; struct sockaddr_in client;
@@ -34,7 +30,7 @@ int main(int argc , char *argv[])
servaddr.sin_family = AF_INET; servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htons(INADDR_ANY); servaddr.sin_addr.s_addr = htons(INADDR_ANY);
servaddr.sin_port = htons(port); servaddr.sin_port = htons(port);
bind(sock, (struct sockaddr *) &servaddr, sizeof(servaddr)); zts_bind(sock, (struct sockaddr *) &servaddr, sizeof(servaddr));
printf("listening\n"); printf("listening\n");
zts_listen(sock , 3); zts_listen(sock , 3);