Hello community, here is the log from the commit of package socket_wrapper for openSUSE:Factory checked in at 2016-06-09 16:12:58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/socket_wrapper (Old) and /work/SRC/openSUSE:Factory/.socket_wrapper.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "socket_wrapper" Changes: -------- --- /work/SRC/openSUSE:Factory/socket_wrapper/socket_wrapper.changes 2016-03-29 14:50:40.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.socket_wrapper.new/socket_wrapper.changes 2016-06-09 16:16:36.000000000 +0200 @@ -1,0 +2,9 @@ +Tue May 31 06:57:22 UTC 2016 - [email protected] + +- Update to version 1.1.7 + * Added support for accept4() + * Added support for OpenBSD + * Fixed sendto() with UDP and a connected socket + * Fixed AF_RAWLINK sockets + +------------------------------------------------------------------- Old: ---- socket_wrapper-1.1.6.tar.gz New: ---- socket_wrapper-1.1.7.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ socket_wrapper.spec ++++++ --- /var/tmp/diff_new_pack.DTpVOl/_old 2016-06-09 16:16:38.000000000 +0200 +++ /var/tmp/diff_new_pack.DTpVOl/_new 2016-06-09 16:16:38.000000000 +0200 @@ -24,7 +24,7 @@ ############################# NOTE ################################## Name: socket_wrapper -Version: 1.1.6 +Version: 1.1.7 Release: 0 Summary: A library passing all socket communications trough Unix sockets License: BSD-3-Clause ++++++ socket_wrapper-1.1.6.tar.gz -> socket_wrapper-1.1.7.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/socket_wrapper-1.1.6/CMakeLists.txt new/socket_wrapper-1.1.7/CMakeLists.txt --- old/socket_wrapper-1.1.6/CMakeLists.txt 2016-03-15 13:54:36.000000000 +0100 +++ new/socket_wrapper-1.1.7/CMakeLists.txt 2016-05-17 12:30:49.000000000 +0200 @@ -8,7 +8,7 @@ set(APPLICATION_VERSION_MAJOR "1") set(APPLICATION_VERSION_MINOR "1") -set(APPLICATION_VERSION_PATCH "6") +set(APPLICATION_VERSION_PATCH "7") set(APPLICATION_VERSION "${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINOR}.${APPLICATION_VERSION_PATCH}") @@ -19,7 +19,7 @@ # Increment AGE. Set REVISION to 0 # If the source code was changed, but there were no interface changes: # Increment REVISION. -set(LIBRARY_VERSION "0.1.6") +set(LIBRARY_VERSION "0.1.7") set(LIBRARY_SOVERSION "0") # where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/socket_wrapper-1.1.6/ChangeLog new/socket_wrapper-1.1.7/ChangeLog --- old/socket_wrapper-1.1.6/ChangeLog 2016-03-15 13:54:36.000000000 +0100 +++ new/socket_wrapper-1.1.7/ChangeLog 2016-05-20 08:57:55.000000000 +0200 @@ -1,6 +1,12 @@ ChangeLog ========== +version 1.1.7 (released 2016-05-20) + * Added support for accept4() + * Added support for OpenBSD + * Fixed sendto() with UDP and a connected socket + * Fixed AF_RAWLINK sockets + version 1.1.6 (released 2016-03-15) * Added a wrapper for write() * Added support for automatic binding of ephemeral ports diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/socket_wrapper-1.1.6/ConfigureChecks.cmake new/socket_wrapper-1.1.7/ConfigureChecks.cmake --- old/socket_wrapper-1.1.6/ConfigureChecks.cmake 2015-03-23 10:10:06.000000000 +0100 +++ new/socket_wrapper-1.1.7/ConfigureChecks.cmake 2016-05-17 11:05:23.000000000 +0200 @@ -62,6 +62,9 @@ check_function_exists(eventfd HAVE_EVENTFD) check_function_exists(timerfd_create HAVE_TIMERFD_CREATE) check_function_exists(bindresvport HAVE_BINDRESVPORT) +check_function_exists(accept4 HAVE_ACCEPT4) + +check_function_exists(pledge HAVE_PLEDGE) if (UNIX) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/socket_wrapper-1.1.6/config.h.cmake new/socket_wrapper-1.1.7/config.h.cmake --- old/socket_wrapper-1.1.6/config.h.cmake 2015-03-23 10:10:06.000000000 +0100 +++ new/socket_wrapper-1.1.7/config.h.cmake 2016-05-17 11:05:23.000000000 +0200 @@ -39,6 +39,8 @@ #cmakedefine HAVE_EVENTFD 1 #cmakedefine HAVE_TIMERFD_CREATE 1 #cmakedefine HAVE_BINDRESVPORT 1 +#cmakedefine HAVE_ACCEPT4 1 +#cmakedefine HAVE_PLEDGE 1 #cmakedefine HAVE_ACCEPT_PSOCKLEN_T 1 #cmakedefine HAVE_IOCTL_INT 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/socket_wrapper-1.1.6/src/socket_wrapper.c new/socket_wrapper-1.1.7/src/socket_wrapper.c --- old/socket_wrapper-1.1.6/src/socket_wrapper.c 2016-03-02 09:29:48.000000000 +0100 +++ new/socket_wrapper-1.1.7/src/socket_wrapper.c 2016-05-17 11:44:04.000000000 +0200 @@ -335,9 +335,16 @@ #include <dlfcn.h> struct swrap_libc_fns { +#ifdef HAVE_ACCEPT4 + int (*libc_accept4)(int sockfd, + struct sockaddr *addr, + socklen_t *addrlen, + int flags); +#else int (*libc_accept)(int sockfd, struct sockaddr *addr, socklen_t *addrlen); +#endif int (*libc_bind)(int sockfd, const struct sockaddr *addr, socklen_t addrlen); @@ -552,12 +559,26 @@ * has probably something todo with with the linker. * So we need load each function at the point it is called the first time. */ +#ifdef HAVE_ACCEPT4 +static int libc_accept4(int sockfd, + struct sockaddr *addr, + socklen_t *addrlen, + int flags) +{ + swrap_load_lib_function(SWRAP_LIBSOCKET, accept4); + + return swrap.fns.libc_accept4(sockfd, addr, addrlen, flags); +} + +#else /* HAVE_ACCEPT4 */ + static int libc_accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { swrap_load_lib_function(SWRAP_LIBSOCKET, accept); return swrap.fns.libc_accept(sockfd, addr, addrlen); } +#endif /* HAVE_ACCEPT4 */ static int libc_bind(int sockfd, const struct sockaddr *addr, @@ -2386,6 +2407,9 @@ #ifdef AF_NETLINK case AF_NETLINK: #endif /* AF_NETLINK */ +#ifdef AF_PACKET + case AF_PACKET: +#endif /* AF_PACKET */ case AF_UNIX: return libc_socket(family, type, protocol); default: @@ -2575,7 +2599,10 @@ * ACCEPT ***************************************************************************/ -static int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen) +static int swrap_accept(int s, + struct sockaddr *addr, + socklen_t *addrlen, + int flags) { struct socket_info *parent_si, *child_si; struct socket_info_fd *child_fi; @@ -2596,7 +2623,11 @@ parent_si = find_socket_info(s); if (!parent_si) { +#ifdef HAVE_ACCEPT4 + return libc_accept4(s, addr, addrlen, flags); +#else return libc_accept(s, addr, addrlen); +#endif } /* @@ -2609,7 +2640,11 @@ return -1; } +#ifdef HAVE_ACCEPT4 + ret = libc_accept4(s, &un_addr.sa.s, &un_addr.sa_socklen, flags); +#else ret = libc_accept(s, &un_addr.sa.s, &un_addr.sa_socklen); +#endif if (ret == -1) { if (errno == ENOTSOCK) { /* Remove stale fds */ @@ -2713,13 +2748,20 @@ return fd; } +#ifdef HAVE_ACCEPT4 +int accept4(int s, struct sockaddr *addr, socklen_t *addrlen, int flags) +{ + return swrap_accept(s, addr, (socklen_t *)addrlen, flags); +} +#endif + #ifdef HAVE_ACCEPT_PSOCKLEN_T int accept(int s, struct sockaddr *addr, Psocklen_t addrlen) #else int accept(int s, struct sockaddr *addr, socklen_t *addrlen) #endif { - return swrap_accept(s, addr, (socklen_t *)addrlen); + return swrap_accept(s, addr, (socklen_t *)addrlen, 0); } static int autobind_start_init; @@ -3880,9 +3922,15 @@ } case SOCK_DGRAM: if (si->connected) { - if (msg->msg_name) { - errno = EISCONN; - return -1; + if (msg->msg_name != NULL) { + /* + * We are dealing with unix sockets and if we + * are connected, we should only talk to the + * connected unix path. Using the fd to send + * to another server would be hard to achieve. + */ + msg->msg_name = NULL; + msg->msg_namelen = 0; } } else { const struct sockaddr *msg_name; @@ -4429,12 +4477,25 @@ return len; } - ret = libc_sendto(s, - buf, - len, - flags, - (struct sockaddr *)msg.msg_name, - msg.msg_namelen); + /* + * If it is a dgram socket and we are connected, don't include the + * 'to' address. + */ + if (si->type == SOCK_DGRAM && si->connected) { + ret = libc_sendto(s, + buf, + len, + flags, + NULL, + 0); + } else { + ret = libc_sendto(s, + buf, + len, + flags, + (struct sockaddr *)msg.msg_name, + msg.msg_namelen); + } swrap_sendmsg_after(s, si, &msg, to, ret); @@ -5248,6 +5309,16 @@ } #endif +#ifdef HAVE_PLEDGE +int pledge(const char *promises, const char *paths[]) +{ + (void)promises; /* unused */ + (void)paths; /* unused */ + + return 0; +} +#endif /* HAVE_PLEDGE */ + /**************************** * DESTRUCTOR ***************************/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/socket_wrapper-1.1.6/tests/test_echo_udp_sendto_recvfrom.c new/socket_wrapper-1.1.7/tests/test_echo_udp_sendto_recvfrom.c --- old/socket_wrapper-1.1.6/tests/test_echo_udp_sendto_recvfrom.c 2015-10-14 11:38:17.000000000 +0200 +++ new/socket_wrapper-1.1.7/tests/test_echo_udp_sendto_recvfrom.c 2016-05-17 11:44:16.000000000 +0200 @@ -192,6 +192,104 @@ } #endif +static void test_connect_sendto_ipv4(void **state) +{ + struct torture_address addr = { + .sa_socklen = sizeof(struct sockaddr_in), + }; + char send_buf[] = "packet.0"; + char recv_buf[64] = {0}; + ssize_t ret; + int rc; + int s; + + (void) state; /* unused */ + + addr.sa.in.sin_family = AF_INET; + addr.sa.in.sin_port = htons(torture_server_port()); + + rc = inet_pton(AF_INET, + torture_server_address(AF_INET), + &addr.sa.in.sin_addr); + assert_int_equal(rc, 1); + + s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + assert_int_not_equal(s, -1); + + /* Now, connect */ + rc = connect(s, &addr.sa.s, addr.sa_socklen); + assert_return_code(rc, errno); + + ret = sendto(s, + send_buf, + sizeof(send_buf), + 0, + &addr.sa.s, + addr.sa_socklen); + assert_return_code(ret, errno); + + ret = recvfrom(s, + recv_buf, + sizeof(recv_buf), + 0, + NULL, + 0); + assert_return_code(ret, errno); + + assert_memory_equal(send_buf, recv_buf, sizeof(send_buf)); + + close(s); +} + +static void test_connect_sendto_null_ipv4(void **state) +{ + struct torture_address addr = { + .sa_socklen = sizeof(struct sockaddr_in), + }; + char send_buf[] = "packet.0"; + char recv_buf[64] = {0}; + ssize_t ret; + int rc; + int s; + + (void) state; /* unused */ + + addr.sa.in.sin_family = AF_INET; + addr.sa.in.sin_port = htons(torture_server_port()); + + rc = inet_pton(AF_INET, + torture_server_address(AF_INET), + &addr.sa.in.sin_addr); + assert_int_equal(rc, 1); + + s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + assert_int_not_equal(s, -1); + + /* Now, connect */ + rc = connect(s, &addr.sa.s, addr.sa_socklen); + assert_return_code(rc, errno); + + ret = sendto(s, + send_buf, + sizeof(send_buf), + 0, + NULL, + 0); + assert_return_code(ret, errno); + + ret = recvfrom(s, + recv_buf, + sizeof(recv_buf), + 0, + NULL, + 0); + assert_return_code(ret, errno); + + assert_memory_equal(send_buf, recv_buf, sizeof(send_buf)); + + close(s); +} + int main(void) { int rc; @@ -204,6 +302,12 @@ setup_echo_srv_udp_ipv6, teardown), #endif + cmocka_unit_test_setup_teardown(test_connect_sendto_ipv4, + setup_echo_srv_udp_ipv4, + teardown), + cmocka_unit_test_setup_teardown(test_connect_sendto_null_ipv4, + setup_echo_srv_udp_ipv4, + teardown), }; rc = cmocka_run_group_tests(sendto_tests, NULL, NULL);
