From bb98fc56979a888d19f7084e329977f2bf6fb713 Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Fri, 29 Jan 2016 00:05:26 +1100 Subject: [PATCH 1/3] ctdb-common: Protocol argument must be in host order for socket() call BUG: https://bugzilla.samba.org/show_bug.cgi?id=11705 Signed-off-by: Amitay Isaacs Reviewed-by: Volker Lendecke (cherry picked from commit 9f8395cb7d49b63a82f75bf504f5f83920102b29) --- ctdb/common/system_aix.c | 4 ++-- ctdb/common/system_common.c | 2 +- ctdb/common/system_freebsd.c | 2 +- ctdb/common/system_gnu.c | 2 +- ctdb/common/system_kfreebsd.c | 2 +- ctdb/common/system_linux.c | 8 ++++---- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ctdb/common/system_aix.c b/ctdb/common/system_aix.c index 41f61ae..2637442 100644 --- a/ctdb/common/system_aix.c +++ b/ctdb/common/system_aix.c @@ -44,7 +44,7 @@ int ctdb_sys_open_sending_socket(void) int s, ret; uint32_t one = 1; - s = socket(AF_INET, SOCK_RAW, htons(IPPROTO_RAW)); + s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (s == -1) { DEBUG(DEBUG_CRIT,(" failed to open raw socket (%s)\n", strerror(errno))); @@ -121,7 +121,7 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest, - s = socket(AF_INET, SOCK_RAW, htons(IPPROTO_RAW)); + s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (s == -1) { DEBUG(DEBUG_CRIT,(" failed to open raw socket (%s)\n", strerror(errno))); diff --git a/ctdb/common/system_common.c b/ctdb/common/system_common.c index 899f3b5..3e30a6c 100644 --- a/ctdb/common/system_common.c +++ b/ctdb/common/system_common.c @@ -85,7 +85,7 @@ char *ctdb_sys_find_ifname(ctdb_sock_addr *addr) struct ifconf ifc; char *ptr; - s = socket(AF_INET, SOCK_RAW, htons(IPPROTO_RAW)); + s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (s == -1) { DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket (%s)\n", strerror(errno))); diff --git a/ctdb/common/system_freebsd.c b/ctdb/common/system_freebsd.c index 9597a7a..d026864 100644 --- a/ctdb/common/system_freebsd.c +++ b/ctdb/common/system_freebsd.c @@ -158,7 +158,7 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest, ip4pkt.tcp.th_sum = tcp_checksum((uint16_t *)&ip4pkt.tcp, sizeof(ip4pkt.tcp), &ip4pkt.ip); /* open a raw socket to send this segment from */ - s = socket(AF_INET, SOCK_RAW, htons(IPPROTO_RAW)); + s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (s == -1) { DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket (%s)\n", strerror(errno))); diff --git a/ctdb/common/system_gnu.c b/ctdb/common/system_gnu.c index 2ab1399..8f776c6 100644 --- a/ctdb/common/system_gnu.c +++ b/ctdb/common/system_gnu.c @@ -156,7 +156,7 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest, ip4pkt.tcp.check = tcp_checksum((uint16_t *)&ip4pkt.tcp, sizeof(ip4pkt.tcp), &ip4pkt.ip); /* open a raw socket to send this segment from */ - s = socket(AF_INET, SOCK_RAW, htons(IPPROTO_RAW)); + s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (s == -1) { DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket (%s)\n", strerror(errno))); diff --git a/ctdb/common/system_kfreebsd.c b/ctdb/common/system_kfreebsd.c index 41aa4d6..7d9182c 100644 --- a/ctdb/common/system_kfreebsd.c +++ b/ctdb/common/system_kfreebsd.c @@ -156,7 +156,7 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest, ip4pkt.tcp.check = tcp_checksum((uint16_t *)&ip4pkt.tcp, sizeof(ip4pkt.tcp), &ip4pkt.ip); /* open a raw socket to send this segment from */ - s = socket(AF_INET, SOCK_RAW, htons(IPPROTO_RAW)); + s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (s == -1) { DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket (%s)\n", strerror(errno))); diff --git a/ctdb/common/system_linux.c b/ctdb/common/system_linux.c index fdb8d12..652c776 100644 --- a/ctdb/common/system_linux.c +++ b/ctdb/common/system_linux.c @@ -93,7 +93,7 @@ int ctdb_sys_send_arp(const ctdb_sock_addr *addr, const char *iface) switch (addr->ip.sin_family) { case AF_INET: - s = socket(PF_PACKET, SOCK_RAW, htons(ETHERTYPE_ARP)); + s = socket(PF_PACKET, SOCK_RAW, ETHERTYPE_ARP); if (s == -1){ DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket\n")); return -1; @@ -187,7 +187,7 @@ int ctdb_sys_send_arp(const ctdb_sock_addr *addr, const char *iface) close(s); break; case AF_INET6: - s = socket(PF_PACKET, SOCK_RAW, htons(ETHERTYPE_ARP)); + s = socket(PF_PACKET, SOCK_RAW, ETHERTYPE_ARP); if (s == -1){ DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket\n")); return -1; @@ -357,7 +357,7 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest, ip4pkt.tcp.check = tcp_checksum((uint16_t *)&ip4pkt.tcp, sizeof(ip4pkt.tcp), &ip4pkt.ip); /* open a raw socket to send this segment from */ - s = socket(AF_INET, SOCK_RAW, htons(IPPROTO_RAW)); + s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (s == -1) { DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket (%s)\n", strerror(errno))); @@ -447,7 +447,7 @@ int ctdb_sys_open_capture_socket(const char *iface, void **private_data) int s; /* Open a socket to capture all traffic */ - s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); + s = socket(AF_PACKET, SOCK_RAW, ETH_P_ALL); if (s == -1) { DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket\n")); return -1; -- 2.5.5 From 8b780b10058a31d055d2111f125de00e3ab7aede Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Fri, 29 Jan 2016 00:06:18 +1100 Subject: [PATCH 2/3] ctdb-common: Use documented names for protocol family in socket() Instead of using PF_*, use AF_*. https://bugzilla.samba.org/show_bug.cgi?id=11705 Signed-off-by: Amitay Isaacs Reviewed-by: Volker Lendecke (cherry picked from commit 9f94620a308a3b17c1886c2c4807b34b8d5edacb) --- ctdb/common/system_freebsd.c | 2 +- ctdb/common/system_gnu.c | 2 +- ctdb/common/system_kfreebsd.c | 2 +- ctdb/common/system_linux.c | 8 ++++---- ctdb/tools/ctdb.c | 4 ++-- ctdb/utils/smnotify/smnotify.c | 6 +++--- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ctdb/common/system_freebsd.c b/ctdb/common/system_freebsd.c index d026864..02f7cce 100644 --- a/ctdb/common/system_freebsd.c +++ b/ctdb/common/system_freebsd.c @@ -208,7 +208,7 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest, ip6pkt.tcp.th_win = htons(1234); ip6pkt.tcp.th_sum = tcp_checksum6((uint16_t *)&ip6pkt.tcp, sizeof(ip6pkt.tcp), &ip6pkt.ip6); - s = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW); + s = socket(AF_INET6, SOCK_RAW, IPPROTO_RAW); if (s == -1) { DEBUG(DEBUG_CRIT, (__location__ " Failed to open sending socket\n")); return -1; diff --git a/ctdb/common/system_gnu.c b/ctdb/common/system_gnu.c index 8f776c6..1e0ae4c 100644 --- a/ctdb/common/system_gnu.c +++ b/ctdb/common/system_gnu.c @@ -203,7 +203,7 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest, ip6pkt.tcp.window = htons(1234); ip6pkt.tcp.check = tcp_checksum6((uint16_t *)&ip6pkt.tcp, sizeof(ip6pkt.tcp), &ip6pkt.ip6); - s = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW); + s = socket(AF_INET6, SOCK_RAW, IPPROTO_RAW); if (s == -1) { DEBUG(DEBUG_CRIT, (__location__ " Failed to open sending socket\n")); return -1; diff --git a/ctdb/common/system_kfreebsd.c b/ctdb/common/system_kfreebsd.c index 7d9182c..7cb6d92 100644 --- a/ctdb/common/system_kfreebsd.c +++ b/ctdb/common/system_kfreebsd.c @@ -203,7 +203,7 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest, ip6pkt.tcp.window = htons(1234); ip6pkt.tcp.check = tcp_checksum6((uint16_t *)&ip6pkt.tcp, sizeof(ip6pkt.tcp), &ip6pkt.ip6); - s = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW); + s = socket(AF_INET6, SOCK_RAW, IPPROTO_RAW); if (s == -1) { DEBUG(DEBUG_CRIT, (__location__ " Failed to open sending socket\n")); return -1; diff --git a/ctdb/common/system_linux.c b/ctdb/common/system_linux.c index 652c776..2e58853 100644 --- a/ctdb/common/system_linux.c +++ b/ctdb/common/system_linux.c @@ -93,7 +93,7 @@ int ctdb_sys_send_arp(const ctdb_sock_addr *addr, const char *iface) switch (addr->ip.sin_family) { case AF_INET: - s = socket(PF_PACKET, SOCK_RAW, ETHERTYPE_ARP); + s = socket(AF_PACKET, SOCK_RAW, ETHERTYPE_ARP); if (s == -1){ DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket\n")); return -1; @@ -187,7 +187,7 @@ int ctdb_sys_send_arp(const ctdb_sock_addr *addr, const char *iface) close(s); break; case AF_INET6: - s = socket(PF_PACKET, SOCK_RAW, ETHERTYPE_ARP); + s = socket(AF_PACKET, SOCK_RAW, ETHERTYPE_ARP); if (s == -1){ DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket\n")); return -1; @@ -406,7 +406,7 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest, ip6pkt.tcp.window = htons(1234); ip6pkt.tcp.check = tcp_checksum6((uint16_t *)&ip6pkt.tcp, sizeof(ip6pkt.tcp), &ip6pkt.ip6); - s = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW); + s = socket(AF_INET6, SOCK_RAW, IPPROTO_RAW); if (s == -1) { DEBUG(DEBUG_CRIT, (__location__ " Failed to open sending socket\n")); return -1; @@ -568,7 +568,7 @@ bool ctdb_sys_check_iface_exists(const char *iface) int s; struct ifreq ifr; - s = socket(PF_PACKET, SOCK_RAW, 0); + s = socket(AF_PACKET, SOCK_RAW, 0); if (s == -1){ /* We dont know if the interface exists, so assume yes */ DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket\n")); diff --git a/ctdb/tools/ctdb.c b/ctdb/tools/ctdb.c index c4490ac..6700119 100644 --- a/ctdb/tools/ctdb.c +++ b/ctdb/tools/ctdb.c @@ -4537,7 +4537,7 @@ static int control_chktcpport(struct ctdb_context *ctdb, int argc, const char ** port = atoi(argv[0]); - s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == -1) { printf("Failed to open local socket\n"); return errno; @@ -4549,7 +4549,7 @@ static int control_chktcpport(struct ctdb_context *ctdb, int argc, const char ** } bzero(&sin, sizeof(sin)); - sin.sin_family = PF_INET; + sin.sin_family = AF_INET; sin.sin_port = htons(port); ret = bind(s, (struct sockaddr *)&sin, sizeof(sin)); close(s); diff --git a/ctdb/utils/smnotify/smnotify.c b/ctdb/utils/smnotify/smnotify.c index d7fd546..d5c5a4c 100644 --- a/ctdb/utils/smnotify/smnotify.c +++ b/ctdb/utils/smnotify/smnotify.c @@ -43,14 +43,14 @@ static int create_socket(const char *addr, int port) int s; struct sockaddr_in sock_in; - s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s == -1) { printf("Failed to open local socket\n"); exit(10); } bzero(&sock_in, sizeof(sock_in)); - sock_in.sin_family = PF_INET; + sock_in.sin_family = AF_INET; sock_in.sin_port = htons(port); inet_aton(addr, &sock_in.sin_addr); if (bind(s, (struct sockaddr *)&sock_in, sizeof(sock_in)) == -1) { @@ -124,7 +124,7 @@ int main(int argc, const char *argv[]) /* Setup a sockaddr_in for the client we want to notify */ bzero(&sock_cl, sizeof(sock_cl)); - sock_cl.sin_family = PF_INET; + sock_cl.sin_family = AF_INET; sock_cl.sin_port = htons(clientport); inet_aton(client, &sock_cl.sin_addr); -- 2.5.5 From 855c8ad9f836fd7b87ed5fc70948f61f18361721 Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Thu, 3 Mar 2016 14:17:40 +1100 Subject: [PATCH 3/3] ctdb-common: For AF_PACKET socket types, protocol is in network order BUG: https://bugzilla.samba.org/show_bug.cgi?id=11770 From man page of packet(7): protocol is the IEEE 802.3 protocol number in network byte order. See the include file for a list of allowed protocols. When protocol is set to htons(ETH_P_ALL), then all protocols are received. Protocol argument was changed from network order to host order wrongly in commit 9f8395cb7d49b63a82f75bf504f5f83920102b29. Specifying "protocol" field to socket(AF_PACKET, ...) call only affects the packets that are recevied. So use protocol = 0 when sending raw packets. Signed-off-by: Amitay Isaacs Reviewed-by: Martin Schwenke Autobuild-User(master): Martin Schwenke Autobuild-Date(master): Fri Mar 4 12:58:50 CET 2016 on sn-devel-144 (cherry picked from commit f5b6a5b13406c245ab9cc8c1699483af9eb21f88) --- ctdb/common/system_linux.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ctdb/common/system_linux.c b/ctdb/common/system_linux.c index 2e58853..9872070 100644 --- a/ctdb/common/system_linux.c +++ b/ctdb/common/system_linux.c @@ -93,7 +93,7 @@ int ctdb_sys_send_arp(const ctdb_sock_addr *addr, const char *iface) switch (addr->ip.sin_family) { case AF_INET: - s = socket(AF_PACKET, SOCK_RAW, ETHERTYPE_ARP); + s = socket(AF_PACKET, SOCK_RAW, 0); if (s == -1){ DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket\n")); return -1; @@ -187,7 +187,7 @@ int ctdb_sys_send_arp(const ctdb_sock_addr *addr, const char *iface) close(s); break; case AF_INET6: - s = socket(AF_PACKET, SOCK_RAW, ETHERTYPE_ARP); + s = socket(AF_PACKET, SOCK_RAW, 0); if (s == -1){ DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket\n")); return -1; @@ -447,7 +447,7 @@ int ctdb_sys_open_capture_socket(const char *iface, void **private_data) int s; /* Open a socket to capture all traffic */ - s = socket(AF_PACKET, SOCK_RAW, ETH_P_ALL); + s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (s == -1) { DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket\n")); return -1; -- 2.5.5