Fixed possible undefined behaviour when UDP RX buffer fills
This commit is contained in:
@@ -21,6 +21,7 @@ endif
|
|||||||
INCLUDES?=
|
INCLUDES?=
|
||||||
DEFS?=
|
DEFS?=
|
||||||
LDLIBS?=
|
LDLIBS?=
|
||||||
|
CFLAGS=
|
||||||
|
|
||||||
include objects.mk
|
include objects.mk
|
||||||
|
|
||||||
@@ -110,7 +111,7 @@ one: $(OBJS) $(ZT1)/service/OneService.o $(ZT1)/one.o $(ZT1)/osdep/LinuxEthernet
|
|||||||
# Build only the intercept library
|
# Build only the intercept library
|
||||||
linux_intercept:
|
linux_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) -O2 -Wall -std=c99 -fPIC -DVERBOSE -D_GNU_SOURCE -DSDK_INTERCEPT -I. -I../$(ZT1)/node -nostdlib -shared -o ../$(INTERCEPT) SDK_Sockets.c SDK_Intercept.c SDK_Debug.c SDK_RPC.c -ldl
|
cd src ; gcc $(CFLAGS) $(DEFS) -O2 -Wall -std=c99 -fPIC -DVERBOSE -D_GNU_SOURCE -DSDK_INTERCEPT -I. -I../$(ZT1)/node -nostdlib -shared -o ../$(INTERCEPT) SDK_Sockets.c SDK_Intercept.c SDK_Debug.c SDK_RPC.c -ldl
|
||||||
|
|
||||||
# Build only the SDK service
|
# Build only the SDK service
|
||||||
linux_sdk_service: lwip $(OBJS)
|
linux_sdk_service: lwip $(OBJS)
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ INCLUDES=
|
|||||||
DEFS=
|
DEFS=
|
||||||
LIBS=
|
LIBS=
|
||||||
ARCH_FLAGS=-arch x86_64
|
ARCH_FLAGS=-arch x86_64
|
||||||
|
CFLAGS=
|
||||||
|
|
||||||
include objects.mk
|
include objects.mk
|
||||||
|
|
||||||
@@ -136,7 +137,7 @@ osx_shared_lib: remove_only_intermediates $(OBJS)
|
|||||||
|
|
||||||
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) -O2 -Wall -std=c99 -fPIC -fno-common -dynamiclib -flat_namespace -DVERBOSE -D_GNU_SOURCE -DNETCON_INTERCEPT -I. -I../zerotierone/node -nostdlib -shared -o ../$(INTERCEPT) SDK_Sockets.c SDK_Intercept.c SDK_Debug.c SDK_RPC.c -ldl
|
cd src ; gcc $(CFLAGS) $(DEFS) -O2 -Wall -std=c99 -fPIC -fno-common -dynamiclib -flat_namespace -DVERBOSE -D_GNU_SOURCE -DNETCON_INTERCEPT -I. -I../zerotierone/node -nostdlib -shared -o ../$(INTERCEPT) SDK_Sockets.c SDK_Intercept.c SDK_Debug.c SDK_RPC.c -ldl
|
||||||
#mv src/$(INTERCEPT_NAME) $(INTERCEPT)
|
#mv src/$(INTERCEPT_NAME) $(INTERCEPT)
|
||||||
|
|
||||||
# Build only the SDK service
|
# Build only the SDK service
|
||||||
@@ -151,7 +152,7 @@ osx_service_and_intercept: remove_only_intermediates osx_intercept osx_sdk_servi
|
|||||||
|
|
||||||
|
|
||||||
# -------- ANDROID ---------
|
# -------- ANDROID ---------
|
||||||
# Build all Android targets
|
# Build all Android targets
|
||||||
# Chip architectures can be specified in integrations/android/android_jni_lib/java/jni/Application.mk
|
# Chip architectures can be specified in integrations/android/android_jni_lib/java/jni/Application.mk
|
||||||
android: android_jni_lib
|
android: android_jni_lib
|
||||||
|
|
||||||
|
|||||||
@@ -119,16 +119,16 @@ NetconEthernetTap::NetconEthernetTap(
|
|||||||
const char *friendlyName,
|
const char *friendlyName,
|
||||||
void (*handler)(void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int),
|
void (*handler)(void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int),
|
||||||
void *arg) :
|
void *arg) :
|
||||||
_nwid(nwid),
|
_homePath(homePath),
|
||||||
_handler(handler),
|
_mac(mac),
|
||||||
_arg(arg),
|
_mtu(mtu),
|
||||||
_phy(this,false,true),
|
_nwid(nwid),
|
||||||
_unixListenSocket((PhySocket *)0),
|
_handler(handler),
|
||||||
_mac(mac),
|
_arg(arg),
|
||||||
_homePath(homePath),
|
_phy(this,false,true),
|
||||||
_mtu(mtu),
|
_unixListenSocket((PhySocket *)0),
|
||||||
_enabled(true),
|
_enabled(true),
|
||||||
_run(true)
|
_run(true)
|
||||||
{
|
{
|
||||||
sockstate = -1;
|
sockstate = -1;
|
||||||
char sockPath[4096],lwipPath[4096];
|
char sockPath[4096],lwipPath[4096];
|
||||||
@@ -763,11 +763,12 @@ void NetconEthernetTap::nc_udp_recved(void * arg, struct udp_pcb * upcb, struct
|
|||||||
// Cycle through pbufs and write them to the RX buffer
|
// Cycle through pbufs and write them to the RX buffer
|
||||||
// The RX "buffer" will be emptied via phyOnUnixWritable()
|
// The RX "buffer" will be emptied via phyOnUnixWritable()
|
||||||
if(p) {
|
if(p) {
|
||||||
// Intra-API "packetization" structure: [addr_len|addr|payload_len|payload]
|
// Intra-API "packetization" scheme: [addr_len|addr|payload_len|payload]
|
||||||
if(l->conn->rxsz == DEFAULT_UDP_RX_BUF_SZ) { // if UDP buffer full
|
if(l->conn->rxsz == DEFAULT_UDP_RX_BUF_SZ) { // if UDP buffer full
|
||||||
dwr(MSG_DEBUG, "nc_udp_recved(): UDP RX buffer full. Discarding oldest payload segment\n");
|
dwr(MSG_DEBUG, "nc_udp_recved(): UDP RX buffer full. Discarding oldest payload segment\n");
|
||||||
memmove(l->conn->rxbuf, l->conn->rxbuf + ZT_MAX_MTU, DEFAULT_UDP_RX_BUF_SZ - ZT_MAX_MTU);
|
memmove(l->conn->rxbuf, l->conn->rxbuf + ZT_MAX_MTU, DEFAULT_UDP_RX_BUF_SZ - ZT_MAX_MTU);
|
||||||
sz_pos = l->conn->rxbuf + (DEFAULT_UDP_RX_BUF_SZ - ZT_MAX_MTU) + sizeof(struct sockaddr_storage);
|
addr_pos = l->conn->rxbuf + (DEFAULT_UDP_RX_BUF_SZ - ZT_MAX_MTU); // TODO:
|
||||||
|
sz_pos = addr_pos + sizeof(struct sockaddr_storage);
|
||||||
l->conn->rxsz -= ZT_MAX_MTU;
|
l->conn->rxsz -= ZT_MAX_MTU;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
#define SENDMSG_SIG int socket, const struct msghdr *message, int flags
|
#define SENDMSG_SIG int socket, const struct msghdr *message, int flags
|
||||||
#define SENDTO_SIG int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *addr, socklen_t addr_len
|
#define SENDTO_SIG int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *addr, socklen_t addr_len
|
||||||
#define RECV_SIG int socket, void *buffer, size_t length, int flags
|
#define RECV_SIG int socket, void *buffer, size_t length, int flags
|
||||||
#define RECVFROM_SIG int socket, void * buffer, size_t length, int flags, struct sockaddr_in * address, socklen_t * address_len
|
#define RECVFROM_SIG int socket, void * buffer, size_t length, int flags, struct sockaddr * address, socklen_t * address_len
|
||||||
#define RECVMSG_SIG int socket, struct msghdr *message,int flags
|
#define RECVMSG_SIG int socket, struct msghdr *message,int flags
|
||||||
|
|
||||||
#define SEND_SIG int socket, const void *buffer, size_t length, int flags
|
#define SEND_SIG int socket, const void *buffer, size_t length, int flags
|
||||||
|
|||||||
@@ -260,7 +260,7 @@ int (*realclose)(CLOSE_SIG);
|
|||||||
jbyte *body = (*env)->GetByteArrayElements(env, buf, 0);
|
jbyte *body = (*env)->GetByteArrayElements(env, buf, 0);
|
||||||
unsigned char buffer[ZT_MAX_MTU];
|
unsigned char buffer[ZT_MAX_MTU];
|
||||||
int payload_offset = sizeof(int) + sizeof(struct sockaddr_storage);
|
int payload_offset = sizeof(int) + sizeof(struct sockaddr_storage);
|
||||||
int rxbytes = zts_recvfrom(fd, &buffer, len, flags, &addr, sizeof(struct sockaddr));
|
int rxbytes = zts_recvfrom(fd, &buffer, len, flags, &addr, sizeof(struct sockaddr_storage));
|
||||||
if(rxbytes > 0)
|
if(rxbytes > 0)
|
||||||
memcpy(body, (jbyte*)buffer + payload_offset, rxbytes);
|
memcpy(body, (jbyte*)buffer + payload_offset, rxbytes);
|
||||||
(*env)->ReleaseByteArrayElements(env, buf, body, 0);
|
(*env)->ReleaseByteArrayElements(env, buf, body, 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user