[SCM] Samba Shared Repository - branch v4-8-stable updated
Karolin Seeger
kseeger at samba.org
Tue Oct 9 08:08:54 UTC 2018
The branch, v4-8-stable has been updated
via 03a6d36 VERSION: Disable GIT_SNAPSHOT for the 4.8.6 release.
via 8b8b0dc WHATSNEW: Add release notes for Samba 4.8.6.
via 0e25965 lib: Hold at most 10 outstanding paged result cookies
via aa529bc lib: Put "results_store" into a doubly linked list
via 189697a ctdb-recoverd: Set recovery lock handle at start of attempt
via 21e4884 ctdb-recoverd: Handle cancellation when releasing recovery lock
via da9bb48 ctdb-recoverd: Return early when the recovery lock is not held
via 72a8c69 ctdb-recoverd: Store recovery lock handle
via 9745524 ctdb-recoverd: Use talloc() to allocate recovery lock handle
via a4c4386 ctdb-recoverd: Rename hold_reclock_state to ctdb_recovery_lock_handle
via 9b1cc7a ctdb-recoverd: Re-check master on failure to take recovery lock
via 43c1ad1 ctdb-recoverd: Clean up taking of recovery lock
via eb498ec ctdb-cluster-mutex: Block signals around fork
via 1954a94 ctdb-cluster-mutex: Reset SIGTERM handler in cluster mutex child
via b29d90f wafsamba: Fix 'make -j<jobs>'
via 3ea96a2 krb5-samba: interdomain trust uses different salt principal
via d726535 testprogs/blackbox: let test_trust_user_account.sh check the correct kerberos salt
via 04fee9e testprogs/blackbox: add testit[_expect_failure]_grep() to subunit.sh
via e311e6e samba-tool: add virtualKerberosSalt attribute to 'user getpassword/syncpasswords'
via 0534104 s4:selftest: test kinit with the interdomain trust user account
via d39a80c libds: rename UF_MACHINE_ACCOUNT_MASK to UF_TRUST_ACCOUNT_MASK
via 772600f vfs_fruit: Don't unlink the main file
via 64a9107 torture: Make sure that fruit_ftruncate only unlinks streams
via 37f8294 s3:smbd: add a comment stating that file_close_user() is redundant for SMB2
via 9fe8691 s3:smbd: let session logoff close files and tcons before deleting the session
via d36fbe9 s3:smbd: reorder tcon global record deletion and closing files of a tcon
via e667b17 selftest: add a durable handle test with delayed disconnect
via 34eeed2 s4:selftest: reformat smb2_s3only list
via 3304d86 vfs_delay_inject: adding delay to VFS calls
via a2b04c3 s4:rpc_server/netlogon: don't treet trusted domains as primary in LogonGetDomainInfo()
via 73e383f s4:rpc_server/netlogon: make use of talloc_zero_array() for the netr_OneDomainInfo array
via 2e7e58a s4:rpc_server/netlogon: use samdb_domain_guid()/dsdb_trust_local_tdo_info() to build our netr_OneDomainInfo values
via e7b4313 s4:dsdb/common: add samdb_domain_guid() helper function
via 66a0554 dsdb:util_trusts: add dsdb_trust_local_tdo_info() helper function
via 96ae85b dsdb/util_trusts: domain_dn is an input parameter of dsdb_trust_crossref_tdo_info()
via b7bd12d s4:torture/rpc/netlogon: verify the trusted domains output of LogonGetDomainInfo()
via 7276bdb s4:torture/rpc/netlogon: assert that cli_credentials_get_{workstation,password} don't return NULL
via 91a5d38 smbd: Fix a memleak in async search ask sharemode
via 8385a0c ctdb-daemon: Log complete eventd startup command
via f3a2f0b ctdb-daemon: Do not retry connection to eventd
via 0f342d4 ctdb-daemon: Wait for eventd to be ready before connecting
via eb3d91e ctdb-daemon: Open eventd pipe earlier
via a4021fb ctdb-daemon: Improve error handling consistency
via ae515ea ctdb-event: Add support to eventd for the startup notification FD
via 0e50da4 ctdb-common: Add support for sock daemon to notify of successful startup
via b53eb6f s3: util: Do not take over stderr when there is no log file
via 1b01025 s3: smbd: Ensure get_real_filename() copes with empty pathnames.
via cdbfc79 WHATSNEW: Fix wrong assignment.
via 3c64c21 VERSION: Bump version up to 4.8.6...
from 9fc7ccf VERSION: Disable GIT_SNAPSHOT for the 4.8.5 release.
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-8-stable
- Log -----------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
VERSION | 2 +-
WHATSNEW.txt | 76 ++++++-
auth/credentials/credentials_krb5.c | 16 +-
buildtools/wafsamba/samba_utils.py | 9 +-
ctdb/common/sock_daemon.c | 26 +++
ctdb/common/sock_daemon.h | 10 +
ctdb/server/ctdb_cluster_mutex.c | 32 +++
ctdb/server/ctdb_eventd.c | 8 +
ctdb/server/ctdb_recoverd.c | 120 +++++++----
ctdb/server/eventscript.c | 156 +++++++++++---
lib/krb5_wrap/krb5_samba.c | 61 ++++--
lib/krb5_wrap/krb5_samba.h | 2 +-
lib/ldb/modules/paged_results.c | 43 ++--
lib/util/debug.c | 7 +-
libds/common/flags.h | 2 +-
python/samba/netcmd/user.py | 24 +++
selftest/target/Samba3.pm | 8 +
source3/locking/share_mode_lock.c | 13 +-
source3/modules/vfs_delay_inject.c | 58 +++++
source3/modules/vfs_fruit.c | 6 +-
source3/modules/wscript_build | 7 +
source3/passdb/machine_account_secrets.c | 3 +-
.../script/tests/test_durable_handle_reconnect.sh | 21 ++
source3/selftest/tests.py | 5 +-
source3/smbd/filename.c | 5 +
source3/smbd/smbXsrv_session.c | 52 +++--
source3/smbd/smbXsrv_tcon.c | 38 ++--
source3/wscript | 1 +
source4/dsdb/common/util.c | 55 +++++
source4/dsdb/common/util_trusts.c | 22 +-
source4/dsdb/samdb/ldb_modules/password_hash.c | 6 +-
source4/rpc_server/netlogon/dcerpc_netlogon.c | 234 +++++++++++++++------
source4/selftest/tests.py | 9 +-
source4/torture/rpc/netlogon.c | 146 ++++++++++++-
source4/torture/smb2/durable_v2_open.c | 95 +++++++++
source4/torture/smb2/smb2.c | 2 +
source4/torture/vfs/fruit.c | 45 ++++
testprogs/blackbox/subunit.sh | 50 +++++
testprogs/blackbox/test_trust_user_account.sh | 58 +++++
39 files changed, 1288 insertions(+), 245 deletions(-)
create mode 100644 source3/modules/vfs_delay_inject.c
create mode 100755 source3/script/tests/test_durable_handle_reconnect.sh
create mode 100755 testprogs/blackbox/test_trust_user_account.sh
Changeset truncated at 500 lines:
diff --git a/VERSION b/VERSION
index 9776c92..9dd6d51 100644
--- a/VERSION
+++ b/VERSION
@@ -25,7 +25,7 @@
########################################################
SAMBA_VERSION_MAJOR=4
SAMBA_VERSION_MINOR=8
-SAMBA_VERSION_RELEASE=5
+SAMBA_VERSION_RELEASE=6
########################################################
# If a official release has a serious bug #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index cde1819..b930398 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,4 +1,72 @@
=============================
+ Release Notes for Samba 4.8.6
+ October 9, 2018
+ =============================
+
+
+This is the latest stable release of the Samba 4.8 release series.
+
+
+Changes since 4.8.5:
+--------------------
+
+o Paulo Alcantara <paulo at paulo.ac>
+ * BUG 13578: s3: util: Do not take over stderr when there is no log file.
+
+o Jeremy Allison <jra at samba.org>
+ * BUG 13585: s3: smbd: Ensure get_real_filename() copes with empty pathnames.
+
+o Ralph Boehme <slow at samba.org>
+ * BUG 13441: vfs_fruit: delete 0 byte size streams if AAPL is enabled.
+ * BUG 13549: s3:smbd: Durable Reconnect fails because cookie.allow_reconnect
+ is not set.
+
+o Alexander Bokovoy <ab at samba.org>
+ * BUG 13539: krb5-samba: Interdomain trust uses different salt principal.
+
+o Volker Lendecke <vl at samba.org>
+ * BUG 13362: Fix possible memory leak in the Samba process.
+ * BUG 13441: vfs_fruit: Don't unlink the main file.
+ * BUG 13602: smbd: Fix a memleak in async search ask sharemode.
+
+o Stefan Metzmacher <metze at samba.org>
+ * BUG 11517: Fix Samba GPO issue when Trust is enabled.
+ * BUG 13539: samba-tool: Add virtualKerberosSalt attribute to 'user
+ getpassword/syncpasswords'.
+
+o Andreas Schneider <asn at samba.org>
+ * BUG 13606: wafsamba: Fix 'make -j<jobs>'.
+
+o Martin Schwenke <martin at meltin.net>
+ * BUG 13592: ctdbd logs an error until it can successfully connect to
+ eventd.
+ * BUG 13617: Fix race conditions in CTDB recovery lock.
+
+
+#######################################
+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.8.5
August 24, 2018
=============================
@@ -13,13 +81,13 @@ Changes since 4.8.4:
o Jeremy Allison <jra at samba.org>
* BUG 13474: python: pysmbd: Additional error path leak fix.
* BUG 13511: libsmbclient: Initialize written value before use.
- * BUG 13519: ldb: Refuse to build Samba against a newer minor version of
- ldb.
* BUG 13527: s3: libsmbclient: Fix cli_splice() fallback when reading less
than a complete file.
* BUG 13537: Using "sendfile = yes" with SMB2 can cause CPU spin.
o Andrew Bartlett <abartlet at samba.org>
+ * BUG 13519: ldb: Refuse to build Samba against a newer minor version of
+ ldb.
* BUG 13575: ldb: Release LDB 1.3.6.
o Bailey Berro <baileyberro at chromium.org>
@@ -110,8 +178,8 @@ database (https://bugzilla.samba.org/).
======================================================================
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
+
=============================
Release Notes for Samba 4.8.4
diff --git a/auth/credentials/credentials_krb5.c b/auth/credentials/credentials_krb5.c
index 9da1aa0..d36797b 100644
--- a/auth/credentials/credentials_krb5.c
+++ b/auth/credentials/credentials_krb5.c
@@ -34,6 +34,7 @@
#include "auth/kerberos/kerberos_util.h"
#include "auth/kerberos/pac_utils.h"
#include "param/param.h"
+#include "../libds/common/flags.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_AUTH
@@ -974,7 +975,7 @@ _PUBLIC_ int cli_credentials_get_keytab(struct cli_credentials *cred,
const char *upn = NULL;
const char *realm = cli_credentials_get_realm(cred);
char *salt_principal = NULL;
- bool is_computer = false;
+ uint32_t uac_flags = 0;
if (cred->keytab_obtained >= (MAX(cred->principal_obtained,
cred->username_obtained))) {
@@ -999,9 +1000,15 @@ _PUBLIC_ int cli_credentials_get_keytab(struct cli_credentials *cred,
switch (cred->secure_channel_type) {
case SEC_CHAN_WKSTA:
- case SEC_CHAN_BDC:
case SEC_CHAN_RODC:
- is_computer = true;
+ uac_flags = UF_WORKSTATION_TRUST_ACCOUNT;
+ break;
+ case SEC_CHAN_BDC:
+ uac_flags = UF_SERVER_TRUST_ACCOUNT;
+ break;
+ case SEC_CHAN_DOMAIN:
+ case SEC_CHAN_DNS_DOMAIN:
+ uac_flags = UF_INTERDOMAIN_TRUST_ACCOUNT;
break;
default:
upn = cli_credentials_get_principal(cred, mem_ctx);
@@ -1009,13 +1016,14 @@ _PUBLIC_ int cli_credentials_get_keytab(struct cli_credentials *cred,
TALLOC_FREE(mem_ctx);
return ENOMEM;
}
+ uac_flags = UF_NORMAL_ACCOUNT;
break;
}
ret = smb_krb5_salt_principal(realm,
username, /* sAMAccountName */
upn, /* userPrincipalName */
- is_computer,
+ uac_flags,
mem_ctx,
&salt_principal);
if (ret) {
diff --git a/buildtools/wafsamba/samba_utils.py b/buildtools/wafsamba/samba_utils.py
index 0f95c12..c20f61e 100644
--- a/buildtools/wafsamba/samba_utils.py
+++ b/buildtools/wafsamba/samba_utils.py
@@ -467,6 +467,7 @@ def CHECK_MAKEFLAGS(bld):
if makeflags is None:
return
jobs_set = False
+ jobs = None
# we need to use shlex.split to cope with the escaping of spaces
# in makeflags
for opt in shlex.split(makeflags):
@@ -489,17 +490,21 @@ def CHECK_MAKEFLAGS(bld):
setattr(Options.options, opt[0:loc], opt[loc+1:])
elif opt[0] != '-':
for v in opt:
- if v == 'j':
+ if re.search(r'j[0-9]*$', v):
jobs_set = True
+ jobs = opt.strip('j')
elif v == 'k':
Options.options.keep = True
- elif opt == '-j':
+ elif re.search(r'-j[0-9]*$', opt):
jobs_set = True
+ jobs = opt.strip('-j')
elif opt == '-k':
Options.options.keep = True
if not jobs_set:
# default to one job
Options.options.jobs = 1
+ elif jobs_set and jobs:
+ Options.options.jobs = int(jobs)
Build.BuildContext.CHECK_MAKEFLAGS = CHECK_MAKEFLAGS
diff --git a/ctdb/common/sock_daemon.c b/ctdb/common/sock_daemon.c
index 7554cd6..03d3ac1 100644
--- a/ctdb/common/sock_daemon.c
+++ b/ctdb/common/sock_daemon.c
@@ -31,6 +31,7 @@
#include "lib/util/dlinklist.h"
#include "lib/util/tevent_unix.h"
#include "lib/util/become_daemon.h"
+#include "lib/util/sys_rw.h"
#include "common/logging.h"
#include "common/reqid.h"
@@ -71,6 +72,7 @@ struct sock_daemon_context {
struct pidfile_context *pid_ctx;
struct sock_socket *socket_list;
+ int startup_fd;
};
/*
@@ -483,6 +485,7 @@ int sock_daemon_setup(TALLOC_CTX *mem_ctx, const char *daemon_name,
sockd->funcs = funcs;
sockd->private_data = private_data;
+ sockd->startup_fd = -1;
ret = logging_init(sockd, logging, debug_level, daemon_name);
if (ret != 0) {
@@ -514,6 +517,11 @@ int sock_daemon_add_unix(struct sock_daemon_context *sockd,
return 0;
}
+void sock_daemon_set_startup_fd(struct sock_daemon_context *sockd, int fd)
+{
+ sockd->startup_fd = fd;
+}
+
/*
* Run socket daemon
*/
@@ -543,6 +551,7 @@ static void sock_daemon_run_socket_fail(struct tevent_req *subreq);
static void sock_daemon_run_watch_pid(struct tevent_req *subreq);
static void sock_daemon_run_wait(struct tevent_req *req);
static void sock_daemon_run_wait_done(struct tevent_req *subreq);
+static void sock_daemon_startup_notify(struct sock_daemon_context *sockd);
struct tevent_req *sock_daemon_run_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
@@ -669,6 +678,8 @@ static void sock_daemon_run_started(struct tevent_req *subreq)
return;
}
sock_daemon_run_wait(req);
+
+ sock_daemon_startup_notify(sockd);
}
static void sock_daemon_run_startup_done(struct tevent_req *subreq)
@@ -696,6 +707,8 @@ static void sock_daemon_run_startup_done(struct tevent_req *subreq)
return;
}
sock_daemon_run_wait(req);
+
+ sock_daemon_startup_notify(sockd);
}
static void sock_daemon_run_signal_handler(struct tevent_context *ev,
@@ -961,6 +974,19 @@ static void sock_daemon_run_wait_done(struct tevent_req *subreq)
sock_daemon_run_shutdown(req);
}
+static void sock_daemon_startup_notify(struct sock_daemon_context *sockd)
+{
+ if (sockd->startup_fd != -1) {
+ unsigned int zero = 0;
+ ssize_t num;
+
+ num = sys_write(sockd->startup_fd, &zero, sizeof(zero));
+ if (num != sizeof(zero)) {
+ D_WARNING("Failed to write zero to pipe FD\n");
+ }
+ }
+}
+
bool sock_daemon_run_recv(struct tevent_req *req, int *perr)
{
int ret;
diff --git a/ctdb/common/sock_daemon.h b/ctdb/common/sock_daemon.h
index a071833..a28f8c6 100644
--- a/ctdb/common/sock_daemon.h
+++ b/ctdb/common/sock_daemon.h
@@ -208,6 +208,16 @@ int sock_daemon_add_unix(struct sock_daemon_context *sockd,
void *private_data);
/**
+ * @brief Set file descriptor for indicating startup success
+ *
+ * On successful completion, 0 (unsigned int) will be written to the fd.
+ *
+ * @param[in] sockd Socket daemon context
+ * @param[in] fd File descriptor
+ */
+void sock_daemon_set_startup_fd(struct sock_daemon_context *sockd, int fd);
+
+/**
* @brief Async computation start to run a socket daemon
*
* @param[in] mem_ctx Talloc memory context
diff --git a/ctdb/server/ctdb_cluster_mutex.c b/ctdb/server/ctdb_cluster_mutex.c
index 804c6d5..330d5fd 100644
--- a/ctdb/server/ctdb_cluster_mutex.c
+++ b/ctdb/server/ctdb_cluster_mutex.c
@@ -196,6 +196,7 @@ ctdb_cluster_mutex(TALLOC_CTX *mem_ctx,
{
struct ctdb_cluster_mutex_handle *h;
char **args;
+ sigset_t sigset_term;
int ret;
h = talloc(mem_ctx, struct ctdb_cluster_mutex_handle);
@@ -225,15 +226,41 @@ ctdb_cluster_mutex(TALLOC_CTX *mem_ctx,
return NULL;
}
+ sigemptyset(&sigset_term);
+ sigaddset(&sigset_term, SIGTERM);
+ ret = sigprocmask(SIG_BLOCK, &sigset_term, NULL);
+ if (ret != 0) {
+ DBG_WARNING("Failed to block SIGTERM (%d)\n", errno);
+ }
+
h->child = ctdb_fork(ctdb);
if (h->child == (pid_t)-1) {
close(h->fd[0]);
close(h->fd[1]);
talloc_free(h);
+ ret = sigprocmask(SIG_UNBLOCK, &sigset_term, NULL);
+ if (ret != 0) {
+ DBG_WARNING("Failed to unblock SIGTERM (%d)\n", errno);
+ }
return NULL;
}
if (h->child == 0) {
+ struct sigaction sa = {
+ .sa_handler = SIG_DFL,
+ };
+
+ ret = sigaction(SIGTERM, &sa, NULL);
+ if (ret != 0) {
+ DBG_WARNING("Failed to reset signal handler (%d)\n",
+ errno);
+ }
+
+ ret = sigprocmask(SIG_UNBLOCK, &sigset_term, NULL);
+ if (ret != 0) {
+ DBG_WARNING("Failed to unblock SIGTERM (%d)\n", errno);
+ }
+
/* Make stdout point to the pipe */
close(STDOUT_FILENO);
dup2(h->fd[1], STDOUT_FILENO);
@@ -248,6 +275,11 @@ ctdb_cluster_mutex(TALLOC_CTX *mem_ctx,
/* Parent */
+ ret = sigprocmask(SIG_UNBLOCK, &sigset_term, NULL);
+ if (ret != 0) {
+ DBG_WARNING("Failed to unblock SIGTERM (%d)\n", errno);
+ }
+
DEBUG(DEBUG_DEBUG, (__location__ " Created PIPE FD:%d\n", h->fd[0]));
set_close_on_exec(h->fd[0]);
diff --git a/ctdb/server/ctdb_eventd.c b/ctdb/server/ctdb_eventd.c
index feeac07..f79ee99 100644
--- a/ctdb/server/ctdb_eventd.c
+++ b/ctdb/server/ctdb_eventd.c
@@ -952,8 +952,10 @@ static struct {
const char *pidfile;
const char *socket;
int pid;
+ int startup_fd;
} options = {
.debug_level = "ERR",
+ .startup_fd = -1,
};
struct poptOption cmdline_options[] = {
@@ -972,6 +974,8 @@ struct poptOption cmdline_options[] = {
"eventd pid file", "FILE" },
{ "socket", 's', POPT_ARG_STRING, &options.socket, 0,
"eventd socket path", "FILE" },
+ { "startup-fd", 'S', POPT_ARG_INT, &options.startup_fd, 0,
+ "file descriptor to notify of successful start", "FD" },
POPT_TABLEEND
};
@@ -1068,6 +1072,10 @@ int main(int argc, const char **argv)
goto fail;
}
+ if (options.startup_fd != -1) {
+ sock_daemon_set_startup_fd(sockd, options.startup_fd);
+ }
+
ret = sock_daemon_run(ev, sockd,
options.pidfile, false, false, options.pid);
if (ret == EINTR) {
diff --git a/ctdb/server/ctdb_recoverd.c b/ctdb/server/ctdb_recoverd.c
index 2b94fed..62e4c46 100644
--- a/ctdb/server/ctdb_recoverd.c
+++ b/ctdb/server/ctdb_recoverd.c
@@ -237,6 +237,8 @@ struct ctdb_banning_state {
struct timeval last_reported_time;
};
+struct ctdb_recovery_lock_handle;
+
/*
private state of recovery daemon
*/
@@ -258,7 +260,7 @@ struct ctdb_recoverd {
uint32_t *force_rebalance_nodes;
struct ctdb_node_capabilities *caps;
bool frozen_on_inactive;
- struct ctdb_cluster_mutex_handle *recovery_lock_handle;
+ struct ctdb_recovery_lock_handle *recovery_lock_handle;
};
#define CONTROL_TIMEOUT() timeval_current_ofs(ctdb->tunable.recover_timeout, 0)
@@ -879,18 +881,19 @@ static bool ctdb_recovery_have_lock(struct ctdb_recoverd *rec)
return (rec->recovery_lock_handle != NULL);
}
-struct hold_reclock_state {
+struct ctdb_recovery_lock_handle {
bool done;
bool locked;
double latency;
+ struct ctdb_cluster_mutex_handle *h;
};
static void take_reclock_handler(char status,
double latency,
void *private_data)
{
- struct hold_reclock_state *s =
- (struct hold_reclock_state *) private_data;
+ struct ctdb_recovery_lock_handle *s =
+ (struct ctdb_recovery_lock_handle *) private_data;
switch (status) {
case '0':
@@ -930,41 +933,68 @@ static bool ctdb_recovery_lock(struct ctdb_recoverd *rec)
{
struct ctdb_context *ctdb = rec->ctdb;
struct ctdb_cluster_mutex_handle *h;
- struct hold_reclock_state s = {
- .done = false,
- .locked = false,
- .latency = 0,
+ struct ctdb_recovery_lock_handle *s;
+
+ s = talloc_zero(rec, struct ctdb_recovery_lock_handle);
+ if (s == NULL) {
+ DBG_ERR("Memory allocation error\n");
+ return false;
};
- h = ctdb_cluster_mutex(rec, ctdb, ctdb->recovery_lock, 0,
- take_reclock_handler, &s,
- lost_reclock_handler, rec);
+ h = ctdb_cluster_mutex(s,
+ ctdb,
+ ctdb->recovery_lock,
+ 0,
+ take_reclock_handler,
+ s,
+ lost_reclock_handler,
+ rec);
if (h == NULL) {
+ talloc_free(s);
return false;
}
- while (!s.done) {
+ rec->recovery_lock_handle = s;
+ s->h = h;
+
+ while (! s->done) {
tevent_loop_once(ctdb->ev);
}
--
Samba Shared Repository
More information about the samba-cvs
mailing list