[SCM] Samba Shared Repository - branch v4-5-stable updated
Karolin Seeger
kseeger at samba.org
Wed Jan 18 06:53:13 UTC 2017
The branch, v4-5-stable has been updated
via f00d8b0 VERSION: Disable git snapshots for the 4.5.4 release.
via 9dac949 WHATSNEW: Add release notes for Samba 4.5.4.
via 45125a4d messaging: Fix dead but not cleaned-up-yet destination sockets
via 0996b58 s3:librpc/gse: make use of gss_krb5_import_cred() instead of gss_acquire_cred()
via 53864b1 s3:librpc/gse: remove unused #ifdef HAVE_GSS_KRB5_IMPORT_CRED
via 05534e0 s3:librpc/gse: include ccache_name in DEBUG message if krb5_cc_resolve() fails
via d60e583 ctdb-tests: Do not attempt to unregister the join handler multiple times
via ceaafa7 smbd/ioctl: match WS2016 ReFS set compression behaviour
via e0bb628 torture/ioctl: test set_compression(format_none)
via 9f196e9 pam: map more NT password errors to PAM errors
via 4d37a14 s3: torture: Add test for cli_ftruncate calling cli_smb2_ftruncate.
via aa69068 s3: libsmb: Add cli_smb2_ftruncate(), plumb into cli_ftruncate().
via ca1885a ctdbd_conn: remove unused fde from struct ctdbd_connection
via 4e6e513 ctdbd_conn: fix a resource leak
via d9e5812 selftest: Do not include system krb5.conf in selftest
via 1d22840 s3:libads: Include system /etc/krb5.conf if we use MIT Kerberos
via 66fce30 s3:param: Add an 'include system krb5 conf' option
via e76e188 s3/smbd: remove a misleading error message
via 586f8b7 vfs_fruit: fix fruit:resource option spelling, but not behaviour
via adbab18 winbindd: Use idmap cache in xids2sids
via 40a5e17 idmap: Prime gencache after xids2sids calls
via 71a9bf9 idmap: Pass up the xid2sids unix-ids from the idmap child
via fbd6779 ctdb-tools: Don't trust non-hosting nodes in "ctdb ip all"
via cfec216 ctdb-tools: Print PNN as int in "ctdb ip -v"
via 90edef1 ctdb-tools: Skip GET_PUBLIC_IP_INFO for unassigned addresses
via 25ba90d ctdb-tools: Fix memory corruption in "ctdb ip -v"
via e04ef4c ctdb-tools: Fix sort order of "ctdb ip" output
via 94c3b81 ctdb-tests: Add unit test for protocol utilities
via edf4817 ctdb-protocol: Add generalised socket address comparison
via 3427e37 ctdb-tests: Fix "ctdb reloadips" simple test
via 9f718c5 VERSION: Bump version up to 4.5.4
via 59738fd Merge tag 'samba-4.5.3' into v4-5-test
via 80185ce s3: ntlm_auth: Don't corrupt the output stream with debug messages.
via 234de87 s3: torture: Adds regression test case for se_access_check() owner rights issue.
via 0b4e710 lib: security: se_access_check() incorrectly processes owner rights (S-1-3-4) DENY ace entries
via 692f7d0 s3: torture: Regression test case for permissions check on rename.
via 55fb639 s3: smbd: Add missing permissions check on destination folder.
via b6d53b6 s3: smbd: Make check_parent_access() available to rename code.
via f66b4b0 s3: smbd: rename - missing early error exit if source and destination prefixes are different.
via bcc2c63 manpages/vfs_fruit: add warning to fruit:resoure=stream
via c764cc4 manpages/vfs_fruit: fruit:resource option misspelling
via 91a3133 Merge tag 'samba-4.5.2' into v4-5-test
via 343718c printing: Fix building with CUPS version older than 1.7
via d869ba0 VERSION: Bump version up to 4.5.3...
via 29680f1 VERSION: Disable git snapshots for the 4.5.2 release.
via 9991ab4 WHATSNEW: Add release notes for Samba 4.5.2.
from 3da5d75 VERSION: Disable git snapshots for the 4.5.3 release.
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-5-stable
- Log -----------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
VERSION | 2 +-
WHATSNEW.txt | 77 +-
ctdb/protocol/protocol_api.h | 10 +-
ctdb/protocol/protocol_util.c | 68 +-
.../{db_hash_test_001.sh => protocol_test_003.sh} | 3 +-
ctdb/tests/simple/18_ctdb_reloadips.sh | 2 -
ctdb/tests/src/cluster_wait.c | 40 +-
ctdb/tests/src/protocol_util_test.c | 82 +
ctdb/tools/ctdb.c | 66 +-
ctdb/wscript | 6 +
docs-xml/manpages/vfs_fruit.8.xml | 39 +-
.../smbdotconf/winbind/includesystemkrb5conf.xml | 15 +
lib/torture/torture.h | 10 +
libcli/auth/pam_errors.c | 6 +-
libcli/security/access_check.c | 2 +-
librpc/idl/winbind.idl | 2 +-
nsswitch/pam_winbind.c | 5 +
python/samba/tests/docs.py | 3 +-
selftest/selftest.pl | 1 +
selftest/skip | 2 +
selftest/target/Samba3.pm | 27 +-
selftest/target/Samba4.pm | 2 +-
source3/include/MacExtensions.h | 3 +
source3/lib/ctdbd_conn.c | 2 -
source3/lib/messages.c | 11 +
source3/lib/messages_ctdbd.c | 2 +
source3/libads/kerberos.c | 13 +-
source3/librpc/crypto/gse.c | 38 +-
source3/libsmb/cli_smb2_fnum.c | 65 +
source3/libsmb/cli_smb2_fnum.h | 3 +
source3/libsmb/clifile.c | 8 +-
source3/modules/vfs_catia.c | 1052 ++++++
source3/modules/vfs_fruit.c | 3479 ++++++++++++++------
source3/modules/vfs_streams_xattr.c | 6 +-
source3/param/loadparm.c | 1 +
source3/selftest/tests.py | 16 +-
source3/smbd/open.c | 2 +-
source3/smbd/proto.h | 3 +
source3/smbd/reply.c | 18 +
source3/smbd/smb2_ioctl_filesys.c | 26 +-
source3/smbd/smbd_cleanupd.c | 1 -
source3/torture/proto.h | 1 +
source3/torture/test_smb2.c | 160 +
source3/torture/torture.c | 579 ++++
source3/utils/ntlm_auth.c | 6 +-
source3/winbindd/wb_xids2sids.c | 41 +-
source3/winbindd/winbindd_dual_srv.c | 1 +
source4/torture/smb2/ioctl.c | 11 +-
source4/torture/vfs/fruit.c | 398 ++-
source4/torture/vfs/vfs.c | 37 +-
50 files changed, 5303 insertions(+), 1150 deletions(-)
copy ctdb/tests/cunit/{db_hash_test_001.sh => protocol_test_003.sh} (64%)
create mode 100644 ctdb/tests/src/protocol_util_test.c
create mode 100644 docs-xml/smbdotconf/winbind/includesystemkrb5conf.xml
Changeset truncated at 500 lines:
diff --git a/VERSION b/VERSION
index 1d7d6a2..5a6461b 100644
--- a/VERSION
+++ b/VERSION
@@ -25,7 +25,7 @@
########################################################
SAMBA_VERSION_MAJOR=4
SAMBA_VERSION_MINOR=5
-SAMBA_VERSION_RELEASE=3
+SAMBA_VERSION_RELEASE=4
########################################################
# If a official release has a serious bug #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index 63a0e9e..e0269f6 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,4 +1,77 @@
=============================
+ Release Notes for Samba 4.5.4
+ January 18, 2017
+ =============================
+
+
+This is the latest stable release of the Samba 4.5 release series.
+
+
+Changes since 4.5.3:
+--------------------
+
+o Jeremy Allison <jra at samba.org>
+ * BUG 12460: rename_internals_fsp missing ACL permission-check on destination
+ folder.
+ * BUG 12466: lib: security: se_access_check() incorrectly processes owner
+ rights (S-1-3-4) DENY ace entries.
+ * BUG 12467: s3: ntlm_auth: Don't corrupt the output stream with debug
+ messages.
+ * BUG 12479: s3: libsmb: Add cli_smb2_ftruncate(), plumb into
+ cli_ftruncate().
+
+o Ralph Boehme <slow at samba.org>
+ * BUG 12396: s3/smbd: Remove a misleading error message.
+ * BUG 12412: vfs_fruit: Fix "fruit:resource" option spelling, but not
+ behaviour.
+ * BUG 12485: ctdbd_conn: Fix a resource leak.
+
+o David Disseldorp <ddiss at samba.org>
+ * BUG 12144: smbd/ioctl: match WS2016 ReFS set compression behaviour.
+
+o Björn Jacke <bj at sernet.de>
+ * BUG 2210: pam: Map more NT password errors to PAM errors.
+
+o Volker Lendecke <vl at samba.org>
+ * BUG 12484: winbindd: Use idmap cache in xids2sids.
+ * BUG 12509: messaging: Fix dead but not cleaned-up-yet destination sockets.
+
+o Stefan Metzmacher <metze at samba.org>
+ * BUG 12480: kinit succeeded but ads_sasl_spnego_gensec_bind(KRB5) failed: An
+ internal error occurred (with MIT krb5).
+
+o Andreas Schneider <asn at samba.org>
+ * BUG 12183: printing: Fix building with CUPS version older than 1.7.
+ * BUG 12441: s3:libads: Include system /etc/krb5.conf if we use MIT Kerberos.
+
+o Martin Schwenke <martin at meltin.net>
+ * BUG 12470: Fix ctdb ip bugs.
+
+
+#######################################
+Reporting bugs & Development Discussion
+#######################################
+
+Please discuss this release on the samba-technical mailing list or by
+joining the #samba-technical IRC channel on irc.freenode.net.
+
+If you do report problems then please try to send high quality
+feedback. If you don't provide vital information to help us track down
+the problem then you will probably be ignored. All bug reports should
+be filed under the Samba 4.1 and newer product in the project's Bugzilla
+database (https://bugzilla.samba.org/).
+
+
+======================================================================
+== Our Code, Our Bugs, Our Responsibility.
+== The Samba Team
+======================================================================
+
+
+Release notes for older releases follow:
+----------------------------------------
+
+ =============================
Release Notes for Samba 4.5.3
December 19, 2016
=============================
@@ -77,8 +150,8 @@ database (https://bugzilla.samba.org/).
======================================================================
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
+
=============================
Release Notes for Samba 4.5.2
diff --git a/ctdb/protocol/protocol_api.h b/ctdb/protocol/protocol_api.h
index d5d00da..7a8357a 100644
--- a/ctdb/protocol/protocol_api.h
+++ b/ctdb/protocol/protocol_api.h
@@ -658,7 +658,13 @@ const char *ctdb_event_to_string(enum ctdb_event event);
enum ctdb_event ctdb_event_from_string(const char *event_str);
const char *ctdb_sock_addr_to_string(TALLOC_CTX *mem_ctx, ctdb_sock_addr *addr);
-bool ctdb_sock_addr_same_ip(ctdb_sock_addr *addr1, ctdb_sock_addr *addr2);
-bool ctdb_sock_addr_same(ctdb_sock_addr *addr1, ctdb_sock_addr *addr2);
+int ctdb_sock_addr_cmp_ip(const ctdb_sock_addr *addr1,
+ const ctdb_sock_addr *addr2);
+int ctdb_sock_addr_cmp(const ctdb_sock_addr *addr1,
+ const ctdb_sock_addr *addr2);
+bool ctdb_sock_addr_same_ip(const ctdb_sock_addr *addr1,
+ const ctdb_sock_addr *addr2);
+bool ctdb_sock_addr_same(const ctdb_sock_addr *addr1,
+ const ctdb_sock_addr *addr2);
#endif /* __CTDB_PROTOCOL_API_H__ */
diff --git a/ctdb/protocol/protocol_util.c b/ctdb/protocol/protocol_util.c
index b91c652..0e1bf28 100644
--- a/ctdb/protocol/protocol_util.c
+++ b/ctdb/protocol/protocol_util.c
@@ -141,55 +141,81 @@ const char *ctdb_sock_addr_to_string(TALLOC_CTX *mem_ctx, ctdb_sock_addr *addr)
return cip;
}
-bool ctdb_sock_addr_same_ip(ctdb_sock_addr *addr1, ctdb_sock_addr *addr2)
+int ctdb_sock_addr_cmp_ip(const ctdb_sock_addr *addr1,
+ const ctdb_sock_addr *addr2)
{
- if (addr1->sa.sa_family != addr2->sa.sa_family) {
- return false;
+ int ret = 0;
+
+ /* This is somewhat arbitrary. However, when used for sorting
+ * it just needs to be consistent.
+ */
+ if (addr1->sa.sa_family < addr2->sa.sa_family) {
+ return -1;
+ }
+ if (addr1->sa.sa_family > addr2->sa.sa_family) {
+ return 1;
}
switch (addr1->sa.sa_family) {
case AF_INET:
- if (addr1->ip.sin_addr.s_addr != addr2->ip.sin_addr.s_addr) {
- return false;
- }
+ ret = memcmp(&addr1->ip.sin_addr.s_addr,
+ &addr2->ip.sin_addr.s_addr, 4);
break;
case AF_INET6:
- if (memcmp(addr1->ip6.sin6_addr.s6_addr,
- addr2->ip6.sin6_addr.s6_addr, 16) != 0) {
- return false;
- }
+ ret = memcmp(addr1->ip6.sin6_addr.s6_addr,
+ addr2->ip6.sin6_addr.s6_addr, 16);
break;
default:
- return false;
+ ret = -1;
}
- return true;
+ return ret;
}
-bool ctdb_sock_addr_same(ctdb_sock_addr *addr1, ctdb_sock_addr *addr2)
+int ctdb_sock_addr_cmp(const ctdb_sock_addr *addr1,
+ const ctdb_sock_addr *addr2)
{
- if (! ctdb_sock_addr_same_ip(addr1, addr2)) {
- return false;
+ int ret = 0;
+
+ ret = ctdb_sock_addr_cmp_ip(addr1, addr2);
+ if (ret != 0) {
+ return ret;
}
switch (addr1->sa.sa_family) {
case AF_INET:
- if (addr1->ip.sin_port != addr2->ip.sin_port) {
- return false;
+ if (addr1->ip.sin_port < addr2->ip.sin_port) {
+ ret = -1;
+ } else if (addr1->ip.sin_port > addr2->ip.sin_port) {
+ ret = 1;
}
break;
case AF_INET6:
- if (addr1->ip6.sin6_port != addr2->ip6.sin6_port) {
- return false;
+ if (addr1->ip6.sin6_port < addr2->ip6.sin6_port) {
+ ret = -1;
+ } else if (addr1->ip6.sin6_port > addr2->ip6.sin6_port) {
+ ret = 1;
}
break;
default:
- return false;
+ ret = -1;
}
- return true;
+ return ret;
+}
+
+bool ctdb_sock_addr_same_ip(const ctdb_sock_addr *addr1,
+ const ctdb_sock_addr *addr2)
+{
+ return (ctdb_sock_addr_cmp_ip(addr1, addr2) == 0);
+}
+
+bool ctdb_sock_addr_same(const ctdb_sock_addr *addr1,
+ const ctdb_sock_addr *addr2)
+{
+ return (ctdb_sock_addr_cmp(addr1, addr2) == 0);
}
diff --git a/ctdb/tests/cunit/db_hash_test_001.sh b/ctdb/tests/cunit/protocol_test_003.sh
similarity index 64%
copy from ctdb/tests/cunit/db_hash_test_001.sh
copy to ctdb/tests/cunit/protocol_test_003.sh
index 76c38fe..012db90 100755
--- a/ctdb/tests/cunit/db_hash_test_001.sh
+++ b/ctdb/tests/cunit/protocol_test_003.sh
@@ -3,5 +3,4 @@
. "${TEST_SCRIPTS_DIR}/unit.sh"
ok_null
-
-unit_test db_hash_test
+unit_test protocol_util_test
diff --git a/ctdb/tests/simple/18_ctdb_reloadips.sh b/ctdb/tests/simple/18_ctdb_reloadips.sh
index 760e476..b68ecfa 100755
--- a/ctdb/tests/simple/18_ctdb_reloadips.sh
+++ b/ctdb/tests/simple/18_ctdb_reloadips.sh
@@ -81,8 +81,6 @@ EOF
try_command_on_node any $CTDB sync
-select_test_node_and_ips
-
echo "Removing IP $test_ip from node $test_node"
try_command_on_node $test_node "mv $addresses $backup && grep -v '^${test_ip}/' $backup >$addresses"
diff --git a/ctdb/tests/src/cluster_wait.c b/ctdb/tests/src/cluster_wait.c
index ddc3e02..1405738 100644
--- a/ctdb/tests/src/cluster_wait.c
+++ b/ctdb/tests/src/cluster_wait.c
@@ -36,6 +36,7 @@ struct cluster_wait_state {
struct ctdb_client_context *client;
int num_nodes;
bool *ready;
+ bool join_done;
};
static void cluster_wait_join_registered(struct tevent_req *subreq);
@@ -44,8 +45,8 @@ static void cluster_wait_join(struct tevent_req *subreq);
static void cluster_wait_join_sent(struct tevent_req *subreq);
static void cluster_wait_join_handler(uint64_t srvid, TDB_DATA data,
void *private_data);
-static void cluster_wait_sync_sent(struct tevent_req *subreq);
static void cluster_wait_join_unregistered(struct tevent_req *subreq);
+static void cluster_wait_sync_sent(struct tevent_req *subreq);
static void cluster_wait_sync_handler(uint64_t srvid, TDB_DATA data,
void *private_data);
static void cluster_wait_sync_unregistered(struct tevent_req *subreq);
@@ -67,6 +68,8 @@ struct tevent_req *cluster_wait_send(TALLOC_CTX *mem_ctx,
state->client = client;
state->num_nodes = num_nodes;
+ state->join_done = false;
+
if (ctdb_client_pnn(client) == 0) {
state->ready = talloc_zero_array(state, bool, num_nodes);
if (tevent_req_nomem(state->ready, req)) {
@@ -201,7 +204,6 @@ static void cluster_wait_join_handler(uint64_t srvid, TDB_DATA data,
private_data, struct tevent_req);
struct cluster_wait_state *state = tevent_req_data(
req, struct cluster_wait_state);
- struct ctdb_req_message msg;
struct tevent_req *subreq;
uint32_t pnn;
int i;
@@ -228,50 +230,56 @@ static void cluster_wait_join_handler(uint64_t srvid, TDB_DATA data,
}
}
- msg.srvid = MSG_ID_SYNC;
- msg.data.data = tdb_null;
+ if (state->join_done) {
+ return;
+ }
- subreq = ctdb_client_message_send(state, state->ev, state->client,
- CTDB_BROADCAST_ALL, &msg);
+ state->join_done = true;
+ subreq = ctdb_client_remove_message_handler_send(
+ state, state->ev, state->client,
+ MSG_ID_JOIN, req);
if (tevent_req_nomem(subreq, req)) {
return;
}
- tevent_req_set_callback(subreq, cluster_wait_sync_sent, req);
+ tevent_req_set_callback(subreq, cluster_wait_join_unregistered, req);
}
-static void cluster_wait_sync_sent(struct tevent_req *subreq)
+static void cluster_wait_join_unregistered(struct tevent_req *subreq)
{
struct tevent_req *req = tevent_req_callback_data(
subreq, struct tevent_req);
struct cluster_wait_state *state = tevent_req_data(
req, struct cluster_wait_state);
+ struct ctdb_req_message msg;
bool status;
int ret;
- status = ctdb_client_message_recv(subreq, &ret);
- TALLOC_FREE(subreq);
+ status = ctdb_client_remove_message_handler_recv(subreq, &ret);
if (! status) {
tevent_req_error(req, ret);
return;
}
- subreq = ctdb_client_remove_message_handler_send(
- state, state->ev, state->client,
- MSG_ID_JOIN, req);
+ msg.srvid = MSG_ID_SYNC;
+ msg.data.data = tdb_null;
+
+ subreq = ctdb_client_message_send(state, state->ev, state->client,
+ CTDB_BROADCAST_ALL, &msg);
if (tevent_req_nomem(subreq, req)) {
return;
}
- tevent_req_set_callback(subreq, cluster_wait_join_unregistered, req);
+ tevent_req_set_callback(subreq, cluster_wait_sync_sent, req);
}
-static void cluster_wait_join_unregistered(struct tevent_req *subreq)
+static void cluster_wait_sync_sent(struct tevent_req *subreq)
{
struct tevent_req *req = tevent_req_callback_data(
subreq, struct tevent_req);
bool status;
int ret;
- status = ctdb_client_remove_message_handler_recv(subreq, &ret);
+ status = ctdb_client_message_recv(subreq, &ret);
+ TALLOC_FREE(subreq);
if (! status) {
tevent_req_error(req, ret);
return;
diff --git a/ctdb/tests/src/protocol_util_test.c b/ctdb/tests/src/protocol_util_test.c
new file mode 100644
index 0000000..752c437
--- /dev/null
+++ b/ctdb/tests/src/protocol_util_test.c
@@ -0,0 +1,82 @@
+/*
+ protocol utilities tests
+
+ Copyright (C) Martin Schwenke 2016
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "replace.h"
+#include "system/network.h"
+
+#include <assert.h>
+
+#include <talloc.h>
+
+#include "protocol/protocol.h"
+#include "protocol/protocol_api.h"
+#include "common/system_util.c"
+
+/* Test parsing of IPs, conversion to string */
+static void test_sock_addr_to_string(const char *ip)
+{
+ ctdb_sock_addr sa;
+ const char *s;
+
+ assert(parse_ip(ip, NULL, 0, &sa));
+ s = ctdb_sock_addr_to_string(NULL, &sa);
+ assert(strcmp(ip, s) == 0);
+ talloc_free(discard_const(s));
+}
+
+static void test_sock_addr_cmp(const char *ip1, const char *ip2, int res)
+{
+ ctdb_sock_addr sa1, sa2;
+ int ret;
+
+ assert(parse_ip(ip1, NULL, 0, &sa1));
+ assert(parse_ip(ip2, NULL, 0, &sa2));
+ ret = ctdb_sock_addr_cmp(&sa1, &sa2);
+ if (ret < 0) {
+ ret = -1;
+ } else if (ret > 0) {
+ ret = 1;
+ }
+
+ assert(ret == res);
+}
+
+int main(int argc, char *argv[])
+{
+ test_sock_addr_to_string("0.0.0.0");
+ test_sock_addr_to_string("127.0.0.1");
+ test_sock_addr_to_string("::1");
+ test_sock_addr_to_string("192.168.2.1");
+ test_sock_addr_to_string("fe80::6af7:28ff:fefa:d136");
+
+ test_sock_addr_cmp("127.0.0.1", "127.0.0.1" , 0);
+ test_sock_addr_cmp("127.0.0.1", "127.0.0.2" , -1);
+ test_sock_addr_cmp("127.0.0.2", "127.0.0.1" , 1);
+ test_sock_addr_cmp("127.0.1.2", "127.0.2.1" , -1);
+ test_sock_addr_cmp("127.0.2.1", "127.0.1.2" , 1);
+ test_sock_addr_cmp("fe80::6af7:28ff:fefa:d136", "127.0.1.2" , 1);
+ test_sock_addr_cmp("fe80::6af7:28ff:fefa:d136",
+ "fe80::6af7:28ff:fefa:d136" , 0);
+ test_sock_addr_cmp("fe80::6af7:28ff:fefa:d136",
+ "fe80::6af7:28ff:fefa:d137" , -1);
+ test_sock_addr_cmp("fe80::6af7:28ff:fefa:d136",
+ "fe80:0000:0000:0000:6af7:28ff:fefa:d136" , 0);
+
+ return 0;
+}
diff --git a/ctdb/tools/ctdb.c b/ctdb/tools/ctdb.c
index 9df6b4e..9d48889 100644
--- a/ctdb/tools/ctdb.c
+++ b/ctdb/tools/ctdb.c
@@ -1374,6 +1374,14 @@ static int control_stats(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
return 0;
}
+static int ctdb_public_ip_cmp(const void *a, const void *b)
+{
+ const struct ctdb_public_ip *ip_a = a;
+ const struct ctdb_public_ip *ip_b = b;
+
+ return ctdb_sock_addr_cmp(&ip_a->addr, &ip_b->addr);
+}
+
static void print_ip(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
struct ctdb_public_ip_list *ips,
struct ctdb_public_ip_info **ipinfo,
@@ -1402,8 +1410,7 @@ static void print_ip(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
}
}
- /* IPs are reverse sorted */
- for (i=ips->num-1; i>=0; i--) {
+ for (i = 0; i < ips->num; i++) {
if (options.machinereadable == 1) {
printf("%s%s%s%d%s", options.sep,
@@ -1429,6 +1436,10 @@ static void print_ip(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
avail = NULL;
active = NULL;
+ if (ipinfo[i] == NULL) {
+ goto skip_ipinfo;
+ }
+
for (j=0; j<ipinfo[i]->ifaces->num; j++) {
struct ctdb_iface *iface;
@@ -1437,7 +1448,7 @@ static void print_ip(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
conf = talloc_strdup(mem_ctx, iface->name);
--
Samba Shared Repository
More information about the samba-cvs
mailing list