From d3b16d78293ba0099cd435736b7a9fab2c2e0201 Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Wed, 4 Nov 2015 02:18:19 +0100 Subject: [PATCH] Use writev() instead of writing before an allocated region --- generic/tcp_proto.c | 14 +++++++------- lib.h | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/generic/tcp_proto.c b/generic/tcp_proto.c index 34b6e35..da99d3a 100644 --- a/generic/tcp_proto.c +++ b/generic/tcp_proto.c @@ -56,16 +56,16 @@ int tcp_write(int fd, char *buf, int len) { - register char *ptr; + struct iovec iov[2]; + uint16_t header; - /* \/ WHOEVER WROTE THAT IS A DANGEROUS PSYCHOPATH \/ */ - ptr = buf - sizeof(short); + header = htons((uint16_t) len); + len = len & VTUN_FSIZE_MASK; - *((unsigned short *)ptr) = htons(len); - /* /\ WHOEVER WROTE THAT IS A DANGEROUS PSYCHOPATH /\ */ - len = (len & VTUN_FSIZE_MASK) + sizeof(short); + iov[0] = (struct iovec) { .iov_base = &header, .iov_len = 2U }; + iov[1] = (struct iovec) { .iov_base = buf, .iov_len = len }; - return write_n(fd, ptr, len); + return write_v(fd, iov, 2); } int tcp_read(int fd, char *buf) diff --git a/lib.h b/lib.h index b42eac0..c660be6 100644 --- a/lib.h +++ b/lib.h @@ -26,6 +26,7 @@ #include #include #include +#include #ifdef HAVE_LIBUTIL_H #include @@ -104,4 +105,18 @@ static inline int write_n(int fd, char *buf, int len) return t; } + +static inline int write_v(int fd, const struct iovec *iov, int iov_count) +{ + ssize_t w = -1; + + while (!__io_canceled) { + if( (w = writev(fd, iov, iov_count)) < 0 ){ + if( errno == EINTR || errno == EAGAIN ) + continue; + } + break; + } + return (int) w; +} #endif /* _VTUN_LIB_H */