The branch, v3-6-test has been updated
via 1525783 socket_wrapper: use swrap_sendmsg_before()/after() in
swrap_writev()
via c9a0e4b socket_wrapper: use swrap_sendmsg_before()/after() in
swrap_sendmsg()
via 0a65c23 socket_wrapper: use swrap_sendmsg_before()/after() in
swrap_send()
via 684b594 socket_wrapper: use swrap_sendmsg_before()/after() in
swrap_sendto()
via 00e93ca socket_wrapper: add swrap_sendmsg_before/after helper
functions
via 4ae3d54 socket_wrapper: replace recvmsg() correctly
via 4722271 socket_wrapper: readv() should only work on connected
sockets
via 50108fb socket_wrapper: move swrap_ioctl() above the send*/recv*
functions
via b0eb58c socket_wrapper: fix compiler warnings
via 2e0534a socket_wrapper: don't allow connect() to the broadcast
address
via b1a14a2 Fix some nonempty blank lines (cherry picked from commit
78525270733a79a6e2def662d7340382cb648414)
from 2a5e9ef s3: Use dom_sid_string_buf in sid_to_fstring
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test
- Log -----------------------------------------------------------------
commit 15257836ab70122823aabdb2073e96282d200eab
Author: Stefan Metzmacher <[email protected]>
Date: Sat Oct 30 16:23:49 2010 +0200
socket_wrapper: use swrap_sendmsg_before()/after() in swrap_writev()
metze
Autobuild-User: Stefan Metzmacher <[email protected]>
Autobuild-Date: Thu Mar 3 23:43:39 CET 2011 on sn-devel-104
(cherry picked from commit a5d54579ea949f4cd7c975c3f5d0006a90777735)
commit c9a0e4bfcb1e3bf226004ce27b99da712c74b233
Author: Stefan Metzmacher <[email protected]>
Date: Sat Oct 30 16:23:49 2010 +0200
socket_wrapper: use swrap_sendmsg_before()/after() in swrap_sendmsg()
This also adds the same logic for broadcast as in swrap_sendto()
for SOCK_DGRAM.
metze
(cherry picked from commit e831376f914d729b9ff3f39c5841846359c712aa)
commit 0a65c2324f89b56792403de9b7df042262eccca5
Author: Stefan Metzmacher <[email protected]>
Date: Sat Oct 30 16:23:49 2010 +0200
socket_wrapper: use swrap_sendmsg_before()/after() in swrap_send()
metze
(cherry picked from commit 4a736f0fbe58fabf6c0a0650cbc38882cb0446ab)
commit 684b594b5106353c508cda885e9d00c3c266e6d7
Author: Stefan Metzmacher <[email protected]>
Date: Sat Oct 30 16:23:49 2010 +0200
socket_wrapper: use swrap_sendmsg_before()/after() in swrap_sendto()
metze
(cherry picked from commit a2db6b4dba2650c582aa4572276d96dac521a3d8)
commit 00e93ca79b934e4907667494e3ae7471a3b50325
Author: Stefan Metzmacher <[email protected]>
Date: Sat Oct 30 16:08:49 2010 +0200
socket_wrapper: add swrap_sendmsg_before/after helper functions
Currently have almost the same logic in swrap_send(), swrap_sendto(),
swrap_writev() and swrap_sendmsg(), this helper functions
let combine all the logic in 2 places.
metze
(cherry picked from commit 8c6d7d7b2797c051885e12e3cdf3da158cf4fe25)
commit 4ae3d540f46a87947d48e62838b7b6849e5c5c5b
Author: Stefan Metzmacher <[email protected]>
Date: Thu Mar 3 15:37:17 2011 +0100
socket_wrapper: replace recvmsg() correctly
metze
(cherry picked from commit c9ae8102099ed66c776c79e88f1a582f3e213fbc)
commit 472227167df70ac2f77b24114b50d69527ef6fe7
Author: Stefan Metzmacher <[email protected]>
Date: Sat Oct 30 16:28:23 2010 +0200
socket_wrapper: readv() should only work on connected sockets
metze
(cherry picked from commit ec028b555bbca84e1f949c6632099f8407c0d695)
commit 50108fb6740fd5f44b29c8dc745fffac37578cac
Author: Stefan Metzmacher <[email protected]>
Date: Sat Oct 30 16:19:33 2010 +0200
socket_wrapper: move swrap_ioctl() above the send*/recv* functions
metze
(cherry picked from commit 7bdc3db9ea5380eeee8d975b3579dcf673a0eafa)
commit b0eb58cc78068c7edc2a09c7fa5c94d04802c124
Author: Stefan Metzmacher <[email protected]>
Date: Wed Mar 2 20:46:45 2011 +0100
socket_wrapper: fix compiler warnings
metze
(cherry picked from commit 0ad8d459c6f47a0d70c8af2b19e6585a38f34cb4)
commit 2e0534a7ed886a3e29140d961e2a393856e2c3c6
Author: Stefan Metzmacher <[email protected]>
Date: Sat Oct 30 16:07:31 2010 +0200
socket_wrapper: don't allow connect() to the broadcast address
This will simplify other code later.
metze
(cherry picked from commit e3c0d6611087184b37399df2bf04053c60c9f043)
commit b1a14a2acd594a63740fbafdce7ec6e5de452edc
Author: Volker Lendecke <[email protected]>
Date: Sat Feb 12 12:18:16 2011 +0100
Fix some nonempty blank lines
(cherry picked from commit 78525270733a79a6e2def662d7340382cb648414)
Signed-off-by: Stefan Metzmacher <[email protected]>
-----------------------------------------------------------------------
Summary of changes:
lib/socket_wrapper/socket_wrapper.c | 673 +++++++++++++++++++++--------------
lib/socket_wrapper/socket_wrapper.h | 6 +
2 files changed, 407 insertions(+), 272 deletions(-)
Changeset truncated at 500 lines:
diff --git a/lib/socket_wrapper/socket_wrapper.c
b/lib/socket_wrapper/socket_wrapper.c
index 594b807..02cce3f 100644
--- a/lib/socket_wrapper/socket_wrapper.c
+++ b/lib/socket_wrapper/socket_wrapper.c
@@ -296,8 +296,8 @@ static int convert_un_in(const struct sockaddr_un *un,
struct sockaddr *in, sock
switch(type) {
case SOCKET_TYPE_CHAR_TCP:
case SOCKET_TYPE_CHAR_UDP: {
- struct sockaddr_in *in2 = (struct sockaddr_in *)in;
-
+ struct sockaddr_in *in2 = (struct sockaddr_in *)(void *)in;
+
if ((*len) < sizeof(*in2)) {
errno = EINVAL;
return -1;
@@ -314,8 +314,8 @@ static int convert_un_in(const struct sockaddr_un *un,
struct sockaddr *in, sock
#ifdef HAVE_IPV6
case SOCKET_TYPE_CHAR_TCP_V6:
case SOCKET_TYPE_CHAR_UDP_V6: {
- struct sockaddr_in6 *in2 = (struct sockaddr_in6 *)in;
-
+ struct sockaddr_in6 *in2 = (struct sockaddr_in6 *)(void *)in;
+
if ((*len) < sizeof(*in2)) {
errno = EINVAL;
return -1;
@@ -352,7 +352,7 @@ static int convert_in_un_remote(struct socket_info *si,
const struct sockaddr *i
switch (inaddr->sa_family) {
case AF_INET: {
const struct sockaddr_in *in =
- (const struct sockaddr_in *)inaddr;
+ (const struct sockaddr_in *)(const void *)inaddr;
unsigned int addr = ntohl(in->sin_addr.s_addr);
char u_type = '\0';
char b_type = '\0';
@@ -395,8 +395,8 @@ static int convert_in_un_remote(struct socket_info *si,
const struct sockaddr *i
#ifdef HAVE_IPV6
case AF_INET6: {
const struct sockaddr_in6 *in =
- (const struct sockaddr_in6 *)inaddr;
- struct in6_addr cmp;
+ (const struct sockaddr_in6 *)(const void *)inaddr;
+ struct in6_addr cmp1, cmp2;
switch (si->type) {
case SOCK_STREAM:
@@ -411,9 +411,10 @@ static int convert_in_un_remote(struct socket_info *si,
const struct sockaddr *i
prt = ntohs(in->sin6_port);
- cmp = in->sin6_addr;
- cmp.s6_addr[15] = 0;
- if (IN6_ARE_ADDR_EQUAL(swrap_ipv6(), &cmp)) {
+ cmp1 = *swrap_ipv6();
+ cmp2 = in->sin6_addr;
+ cmp2.s6_addr[15] = 0;
+ if (IN6_ARE_ADDR_EQUAL(&cmp1, &cmp2)) {
iface = in->sin6_addr.s6_addr[15];
} else {
errno = ENETUNREACH;
@@ -460,7 +461,7 @@ static int convert_in_un_alloc(struct socket_info *si,
const struct sockaddr *in
switch (si->family) {
case AF_INET: {
const struct sockaddr_in *in =
- (const struct sockaddr_in *)inaddr;
+ (const struct sockaddr_in *)(const void *)inaddr;
unsigned int addr = ntohl(in->sin_addr.s_addr);
char u_type = '\0';
char d_type = '\0';
@@ -511,8 +512,8 @@ static int convert_in_un_alloc(struct socket_info *si,
const struct sockaddr *in
#ifdef HAVE_IPV6
case AF_INET6: {
const struct sockaddr_in6 *in =
- (const struct sockaddr_in6 *)inaddr;
- struct in6_addr cmp;
+ (const struct sockaddr_in6 *)(const void *)inaddr;
+ struct in6_addr cmp1, cmp2;
switch (si->type) {
case SOCK_STREAM:
@@ -527,11 +528,12 @@ static int convert_in_un_alloc(struct socket_info *si,
const struct sockaddr *in
prt = ntohs(in->sin6_port);
- cmp = in->sin6_addr;
- cmp.s6_addr[15] = 0;
+ cmp1 = *swrap_ipv6();
+ cmp2 = in->sin6_addr;
+ cmp2.s6_addr[15] = 0;
if (IN6_IS_ADDR_UNSPECIFIED(&in->sin6_addr)) {
iface = socket_wrapper_default_iface();
- } else if (IN6_ARE_ADDR_EQUAL(swrap_ipv6(), &cmp)) {
+ } else if (IN6_ARE_ADDR_EQUAL(&cmp1, &cmp2)) {
iface = in->sin6_addr.s6_addr[15];
} else {
errno = EADDRNOTAVAIL;
@@ -614,7 +616,7 @@ static int sockaddr_convert_to_un(struct socket_info *si,
const struct sockaddr
default:
break;
}
-
+
errno = EAFNOSUPPORT;
return -1;
}
@@ -1504,7 +1506,7 @@ _PUBLIC_ int swrap_accept(int s, struct sockaddr *addr,
socklen_t *addrlen)
memset(&un_addr, 0, sizeof(un_addr));
memset(&un_my_addr, 0, sizeof(un_my_addr));
- ret = real_accept(s, (struct sockaddr *)&un_addr, &un_addrlen);
+ ret = real_accept(s, (struct sockaddr *)(void *)&un_addr, &un_addrlen);
if (ret == -1) {
free(my_addr);
return ret;
@@ -1542,7 +1544,8 @@ _PUBLIC_ int swrap_accept(int s, struct sockaddr *addr,
socklen_t *addrlen)
*addrlen = 0;
}
- ret = real_getsockname(fd, (struct sockaddr *)&un_my_addr,
&un_my_addrlen);
+ ret = real_getsockname(fd, (struct sockaddr *)(void *)&un_my_addr,
+ &un_my_addrlen);
if (ret == -1) {
free(child_si);
close(fd);
@@ -1669,8 +1672,9 @@ static int swrap_auto_bind(struct socket_info *si, int
family)
"%s/"SOCKET_FORMAT, socket_wrapper_dir(),
type, socket_wrapper_default_iface(), port);
if (stat(un_addr.sun_path, &st) == 0) continue;
-
- ret = real_bind(si->fd, (struct sockaddr *)&un_addr,
sizeof(un_addr));
+
+ ret = real_bind(si->fd, (struct sockaddr *)(void *)&un_addr,
+ sizeof(un_addr));
if (ret == -1) return ret;
si->tmp_path = strdup(un_addr.sun_path);
@@ -1695,6 +1699,7 @@ _PUBLIC_ int swrap_connect(int s, const struct sockaddr
*serv_addr, socklen_t ad
int ret;
struct sockaddr_un un_addr;
struct socket_info *si = find_socket_info(s);
+ int bcast = 0;
if (!si) {
return real_connect(s, serv_addr, addrlen);
@@ -1710,16 +1715,22 @@ _PUBLIC_ int swrap_connect(int s, const struct sockaddr
*serv_addr, socklen_t ad
return -1;
}
- ret = sockaddr_convert_to_un(si, (const struct sockaddr *)serv_addr,
addrlen, &un_addr, 0, NULL);
+ ret = sockaddr_convert_to_un(si, serv_addr,
+ addrlen, &un_addr, 0, &bcast);
if (ret == -1) return -1;
+ if (bcast) {
+ errno = ENETUNREACH;
+ return -1;
+ }
+
if (si->type == SOCK_DGRAM) {
si->defer_connect = 1;
ret = 0;
} else {
swrap_dump_packet(si, serv_addr, SWRAP_CONNECT_SEND, NULL, 0);
- ret = real_connect(s, (struct sockaddr *)&un_addr,
+ ret = real_connect(s, (struct sockaddr *)(void *)&un_addr,
sizeof(struct sockaddr_un));
}
@@ -1755,12 +1766,12 @@ _PUBLIC_ int swrap_bind(int s, const struct sockaddr
*myaddr, socklen_t addrlen)
si->myname_len = addrlen;
si->myname = sockaddr_dup(myaddr, addrlen);
- ret = sockaddr_convert_to_un(si, (const struct sockaddr *)myaddr,
addrlen, &un_addr, 1, &si->bcast);
+ ret = sockaddr_convert_to_un(si, myaddr, addrlen, &un_addr, 1,
&si->bcast);
if (ret == -1) return -1;
unlink(un_addr.sun_path);
- ret = real_bind(s, (struct sockaddr *)&un_addr,
+ ret = real_bind(s, (struct sockaddr *)(void *)&un_addr,
sizeof(struct sockaddr_un));
if (ret == 0) {
@@ -1859,6 +1870,223 @@ _PUBLIC_ int swrap_setsockopt(int s, int level, int
optname, const void *o
}
}
+_PUBLIC_ int swrap_ioctl(int s, int r, void *p)
+{
+ int ret;
+ struct socket_info *si = find_socket_info(s);
+ int value;
+
+ if (!si) {
+ return real_ioctl(s, r, p);
+ }
+
+ ret = real_ioctl(s, r, p);
+
+ switch (r) {
+ case FIONREAD:
+ value = *((int *)p);
+ if (ret == -1 && errno != EAGAIN && errno != ENOBUFS) {
+ swrap_dump_packet(si, NULL, SWRAP_PENDING_RST, NULL, 0);
+ } else if (value == 0) { /* END OF FILE */
+ swrap_dump_packet(si, NULL, SWRAP_PENDING_RST, NULL, 0);
+ }
+ break;
+ }
+
+ return ret;
+}
+
+static ssize_t swrap_sendmsg_before(struct socket_info *si,
+ struct msghdr *msg,
+ struct iovec *tmp_iov,
+ struct sockaddr_un *tmp_un,
+ const struct sockaddr_un **to_un,
+ const struct sockaddr **to,
+ int *bcast)
+{
+ size_t i, len = 0;
+ ssize_t ret;
+
+ if (to_un) {
+ *to_un = NULL;
+ }
+ if (to) {
+ *to = NULL;
+ }
+ if (bcast) {
+ *bcast = 0;
+ }
+
+ switch (si->type) {
+ case SOCK_STREAM:
+ if (!si->connected) {
+ errno = ENOTCONN;
+ return -1;
+ }
+
+ if (msg->msg_iovlen == 0) {
+ break;
+ }
+
+ /*
+ * cut down to 1500 byte packets for stream sockets,
+ * which makes it easier to format PCAP capture files
+ * (as the caller will simply continue from here)
+ */
+
+ for (i=0; i < msg->msg_iovlen; i++) {
+ size_t nlen;
+ nlen = len + msg->msg_iov[i].iov_len;
+ if (nlen > 1500) {
+ break;
+ }
+ }
+ msg->msg_iovlen = i;
+ if (msg->msg_iovlen == 0) {
+ *tmp_iov = msg->msg_iov[0];
+ tmp_iov->iov_len = MIN(tmp_iov->iov_len, 1500);
+ msg->msg_iov = tmp_iov;
+ msg->msg_iovlen = 1;
+ }
+ break;
+
+ case SOCK_DGRAM:
+ if (si->connected) {
+ if (msg->msg_name) {
+ errno = EISCONN;
+ return -1;
+ }
+ } else {
+ const struct sockaddr *msg_name;
+ msg_name = (const struct sockaddr *)msg->msg_name;
+
+ if (msg_name == NULL) {
+ errno = ENOTCONN;
+ return -1;
+ }
+
+
+ ret = sockaddr_convert_to_un(si, msg_name,
msg->msg_namelen,
+ tmp_un, 0, bcast);
+ if (ret == -1) return -1;
+
+ if (to_un) {
+ *to_un = tmp_un;
+ }
+ if (to) {
+ *to = msg_name;
+ }
+ msg->msg_name = tmp_un;
+ msg->msg_namelen = sizeof(*tmp_un);
+ }
+
+ if (si->bound == 0) {
+ ret = swrap_auto_bind(si, si->family);
+ if (ret == -1) return -1;
+ }
+
+ if (!si->defer_connect) {
+ break;
+ }
+
+ ret = sockaddr_convert_to_un(si, si->peername, si->peername_len,
+ tmp_un, 0, NULL);
+ if (ret == -1) return -1;
+
+ ret = real_connect(si->fd, (struct sockaddr *)(void *)tmp_un,
+ sizeof(*tmp_un));
+
+ /* to give better errors */
+ if (ret == -1 && errno == ENOENT) {
+ errno = EHOSTUNREACH;
+ }
+
+ if (ret == -1) {
+ return ret;
+ }
+
+ si->defer_connect = 0;
+ break;
+ default:
+ errno = EHOSTUNREACH;
+ return -1;
+ }
+
+ return 0;
+}
+
+static void swrap_sendmsg_after(struct socket_info *si,
+ struct msghdr *msg,
+ const struct sockaddr *to,
+ ssize_t ret)
+{
+ int saved_errno = errno;
+ size_t i, len = 0;
+ uint8_t *buf;
+ off_t ofs = 0;
+ size_t avail = 0;
+ size_t remain;
+
+ /* to give better errors */
+ if (ret == -1 && saved_errno == ENOENT) {
+ saved_errno = EHOSTUNREACH;
+ }
+
+ for (i=0; i < msg->msg_iovlen; i++) {
+ avail += msg->msg_iov[i].iov_len;
+ }
+
+ if (ret == -1) {
+ remain = MIN(80, avail);
+ } else {
+ remain = ret;
+ }
+
+ /* we capture it as one single packet */
+ buf = (uint8_t *)malloc(remain);
+ if (!buf) {
+ /* we just not capture the packet */
+ errno = saved_errno;
+ return;
+ }
+
+ for (i=0; i < msg->msg_iovlen; i++) {
+ size_t this_time = MIN(remain, msg->msg_iov[i].iov_len);
+ memcpy(buf + ofs,
+ msg->msg_iov[i].iov_base,
+ this_time);
+ ofs += this_time;
+ remain -= this_time;
+ }
+ len = ofs;
+
+ switch (si->type) {
+ case SOCK_STREAM:
+ if (ret == -1) {
+ swrap_dump_packet(si, NULL, SWRAP_SEND, buf, len);
+ swrap_dump_packet(si, NULL, SWRAP_SEND_RST, NULL, 0);
+ } else {
+ swrap_dump_packet(si, NULL, SWRAP_SEND, buf, len);
+ }
+ break;
+
+ case SOCK_DGRAM:
+ if (si->connected) {
+ to = si->peername;
+ }
+ if (ret == -1) {
+ swrap_dump_packet(si, to, SWRAP_SENDTO, buf, len);
+ swrap_dump_packet(si, to, SWRAP_SENDTO_UNREACH, buf,
len);
+ } else {
+ swrap_dump_packet(si, to, SWRAP_SENDTO, buf, len);
+ }
+ break;
+ }
+
+ free(buf);
+ errno = saved_errno;
+}
+
_PUBLIC_ ssize_t swrap_recvfrom(int s, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen)
{
struct sockaddr_un un_addr;
@@ -1873,7 +2101,7 @@ _PUBLIC_ ssize_t swrap_recvfrom(int s, void *buf, size_t
len, int flags, struct
}
if (!from) {
- from = (struct sockaddr *)&ss;
+ from = (struct sockaddr *)(void *)&ss;
fromlen = &ss_len;
}
@@ -1886,7 +2114,8 @@ _PUBLIC_ ssize_t swrap_recvfrom(int s, void *buf, size_t
len, int flags, struct
/* irix 6.4 forgets to null terminate the sun_path string :-( */
memset(&un_addr, 0, sizeof(un_addr));
- ret = real_recvfrom(s, buf, len, flags, (struct sockaddr *)&un_addr,
&un_addrlen);
+ ret = real_recvfrom(s, buf, len, flags,
+ (struct sockaddr *)(void *)&un_addr, &un_addrlen);
if (ret == -1)
return ret;
@@ -1903,8 +2132,11 @@ _PUBLIC_ ssize_t swrap_recvfrom(int s, void *buf, size_t
len, int flags, struct
_PUBLIC_ ssize_t swrap_sendto(int s, const void *buf, size_t len, int flags,
const struct sockaddr *to, socklen_t tolen)
{
+ struct msghdr msg;
+ struct iovec tmp;
struct sockaddr_un un_addr;
- int ret;
+ const struct sockaddr_un *to_un = NULL;
+ ssize_t ret;
struct socket_info *si = find_socket_info(s);
int bcast = 0;
@@ -1912,126 +2144,50 @@ _PUBLIC_ ssize_t swrap_sendto(int s, const void *buf,
size_t len, int flags, con
return real_sendto(s, buf, len, flags, to, tolen);
}
- if (si->connected) {
- if (to) {
- errno = EISCONN;
- return -1;
- }
+ tmp.iov_base = discard_const_p(char, buf);
+ tmp.iov_len = len;
- to = si->peername;
- tolen = si->peername_len;
- }
+ msg.msg_name = discard_const_p(struct sockaddr, to); /* optional
address */
+ msg.msg_namelen = tolen; /* size of address */
+ msg.msg_iov = &tmp; /* scatter/gather array */
+ msg.msg_iovlen = 1; /* # elements in msg_iov */
+ msg.msg_control = NULL; /* ancillary data, see below */
+ msg.msg_controllen = 0; /* ancillary data buffer len */
+ msg.msg_flags = 0; /* flags on received message */
- switch (si->type) {
- case SOCK_STREAM:
- /* cut down to 1500 byte packets for stream sockets,
- * which makes it easier to format PCAP capture files
- * (as the caller will simply continue from here) */
- len = MIN(len, 1500);
-
- ret = real_send(s, buf, len, flags);
- break;
- case SOCK_DGRAM:
- if (si->bound == 0) {
- ret = swrap_auto_bind(si, si->family);
- if (ret == -1) return -1;
- }
-
- ret = sockaddr_convert_to_un(si, to, tolen, &un_addr, 0,
&bcast);
- if (ret == -1) return -1;
-
- if (bcast) {
- struct stat st;
- unsigned int iface;
- unsigned int prt = ntohs(((const struct sockaddr_in
*)to)->sin_port);
- char type;
-
- type = SOCKET_TYPE_CHAR_UDP;
-
- for(iface=0; iface <= MAX_WRAPPED_INTERFACES; iface++) {
- snprintf(un_addr.sun_path,
sizeof(un_addr.sun_path), "%s/"SOCKET_FORMAT,
- socket_wrapper_dir(), type, iface,
prt);
- if (stat(un_addr.sun_path, &st) != 0) continue;
-
- /* ignore the any errors in broadcast sends */
- real_sendto(s, buf, len, flags, (struct
sockaddr *)&un_addr, sizeof(un_addr));
- }
-
- swrap_dump_packet(si, to, SWRAP_SENDTO, buf, len);
-
--
Samba Shared Repository