[SCM] Samba Shared Repository - branch master updated
Andrew Bartlett
abartlet at samba.org
Fri Nov 24 04:17:02 UTC 2017
The branch, master has been updated
via 926e7a7 lib/replace: apply readline -Wstrict-prototypes workaround
via 16cedcb lib/smbreadline: detect picky compile issue with readline.h
via 4fc4e41 pam_wrapper: Use a constant string format specifier in test
via 98b1bee pam_wrapper: use uintptr_t as base for const-discarding
via d97feb4 vfs_full_audit: make do_log() printf-aware
via 2bf01b2 s4-torture: fix type of enum in various places
via 559367e s4-torture: fix truncation warnings
via 8990570 winbind_nss_freebsd: fix const discard warning
via 786e3c1 pam_winbind: fix const discard warnings
via 11c95b8 s3:torture: Fix building with -O3 and gcc 7
via 8eb95bc schema_set: Add comment about set schema from ldif in a transaction
via 17f1c6f schema: Make writing indices flag an enum for a new state
via 84a7bae python:tests: Use bin/tdbdump only if built
from 667335a build: ensure compiler flags are properly detected
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 926e7a7cb46ef2b243f1247eee48c87ea546849b
Author: Uri Simchoni <uri at samba.org>
Date: Sun Nov 19 20:22:33 2017 +0000
lib/replace: apply readline -Wstrict-prototypes workaround
clang -Wstrict-prototypes has issues with readline > 6.3.
Fix suggested by Timur I. Bakeyev <timur at freebsd.org>
cf. https://lists.gnu.org/archive/html/bug-readline/2014-04/msg00018.html
cf. https://lists.samba.org/archive/samba-technical/2017-November/123923.html
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
Autobuild-Date(master): Fri Nov 24 05:16:10 CET 2017 on sn-devel-144
commit 16cedcb173da89a9d6f8894e6ff4a42158c5c3b2
Author: Uri Simchoni <uri at samba.org>
Date: Thu Nov 23 22:20:52 2017 +0200
lib/smbreadline: detect picky compile issue with readline.h
readline.h has build issues with clang if -Wstrict-prototypes
is enabled. Detect this and also detect whether the known
workaround works.
Fix suggested by Timur I. Bakeyev <timur at freebsd.org>
cf. https://lists.gnu.org/archive/html/bug-readline/2014-04/msg00018.html
cf. https://lists.samba.org/archive/samba-technical/2017-November/123923.html
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 4fc4e41760af91fb1fa28f6a9a8b1ee7e4d47dbc
Author: Uri Simchoni <uri at samba.org>
Date: Wed Nov 22 20:48:23 2017 +0000
pam_wrapper: Use a constant string format specifier in test
This fixes a warning about non-constant format specifier.
clang 4.0.0 warns against non-constant format specifier since
it cannot validate the format against the parameters.
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
(ported from pam_wrapper 9265da3857e9cfa7a00d1ab35aae1e0b0286efad)
commit 98b1beee721c0ca32e10f4331e767d07be471dd3
Author: Uri Simchoni <uri at samba.org>
Date: Sun Nov 19 13:08:30 2017 +0000
pam_wrapper: use uintptr_t as base for const-discarding
Seems like HAVE_INTPTR_T is not available on FreeBSD. Use
the uintptr_t-base const discarding to avoid picky compiler
warnings (other places in Samba also use uintptr_t).
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
(ported from pam_wrapper c611121eec7b5f2c39cab7b1c0295eddefdddb1d)
commit d97feb40e543dfc122569d4ac2dcb208ba661bc7
Author: Uri Simchoni <uri at samba.org>
Date: Sun Nov 19 18:44:06 2017 +0000
vfs_full_audit: make do_log() printf-aware
Add PRINTF_ATTRIBUTE() to do_log(). This removes
picky compiler warning about printf with variable
format string, and adds compiler checks for the format
strings supplied to do_log. This in turn spurred some
warnings which are fixed.
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 2bf01b286c36e635b1ee0469c97394b6c075b3a3
Author: Uri Simchoni <uri at samba.org>
Date: Sun Nov 19 17:54:32 2017 +0000
s4-torture: fix type of enum in various places
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 559367ed60a316943d97a10a14ba11bcc01204c5
Author: Uri Simchoni <uri at samba.org>
Date: Sun Nov 19 17:11:28 2017 +0000
s4-torture: fix truncation warnings
Fix various places where there is potential truncation
while doing time / size calculations.
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 899057012187954179297e1b3ae110e717702eba
Author: Uri Simchoni <uri at samba.org>
Date: Mon Nov 20 21:18:01 2017 +0200
winbind_nss_freebsd: fix const discard warning
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 786e3c1d82fdb25510d4d257ec993e5b236f78b3
Author: Uri Simchoni <uri at samba.org>
Date: Sun Nov 19 13:15:12 2017 +0000
pam_winbind: fix const discard warnings
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 11c95b8c8dc8ba9db5b7a657ca1e77fac63b8cf0
Author: Andreas Schneider <asn at samba.org>
Date: Thu Nov 23 17:10:42 2017 +0100
s3:torture: Fix building with -O3 and gcc 7
Signed-off-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 8eb95bc1d1ef3d9f6eb41d628b8fb0c8f98cc3c6
Author: Garming Sam <garming at catalyst.net.nz>
Date: Wed Nov 22 12:46:31 2017 +1300
schema_set: Add comment about set schema from ldif in a transaction
This is normally called with a transaction or before access is shared.
The python code and some tests may also cause an issue, but as these are
fixed at runtime, this is only a temporary issue that resolves itself.
Signed-off-by: Garming Sam <garming at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 17f1c6f9f4c6d14c69d0d7030fcd919fbc0f6231
Author: Garming Sam <garming at catalyst.net.nz>
Date: Wed Nov 22 12:34:01 2017 +1300
schema: Make writing indices flag an enum for a new state
In schema_load_init, we find that the writing of indices is not locked
in any way. This leads to race conditions. To resolve this, we need to
have a new state (SCHEMA_COMPARE) which can report to the caller that we
need to open a transaction to write the indices.
Signed-off-by: Garming Sam <garming at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 84a7baeef30a41d51eff8e6486ed67ed3318b115
Author: Andreas Schneider <asn at samba.org>
Date: Wed Nov 22 16:53:52 2017 +0100
python:tests: Use bin/tdbdump only if built
Signed-off-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
-----------------------------------------------------------------------
Summary of changes:
lib/pam_wrapper/python/pypamtest.c | 16 +++----
lib/replace/system/readline.h | 3 ++
libcli/smbreadline/wscript_configure | 33 +++++++++++++++
nsswitch/pam_winbind.c | 4 +-
nsswitch/winbind_nss_freebsd.c | 9 +++-
python/samba/tests/registry.py | 6 ++-
source3/modules/vfs_full_audit.c | 26 ++++++++----
source3/torture/torture.c | 3 +-
source4/dsdb/pydsdb.c | 2 +-
source4/dsdb/repl/replicated_objects.c | 14 +++----
source4/dsdb/samdb/ldb_modules/schema_load.c | 63 ++++++++++++++++++++++++----
source4/dsdb/schema/schema.h | 6 +++
source4/dsdb/schema/schema_set.c | 51 +++++++++++++++++++---
source4/dsdb/schema/tests/schema_syntax.c | 2 +-
source4/libnet/libnet_vampire.c | 4 +-
source4/torture/basic/base.c | 6 +--
source4/torture/drs/drs_util.c | 2 +-
source4/torture/raw/open.c | 2 +-
source4/torture/raw/qfileinfo.c | 2 +-
source4/torture/raw/qfsinfo.c | 5 ++-
source4/torture/rpc/clusapi.c | 2 +-
source4/torture/smb2/ioctl.c | 4 +-
source4/torture/smb2/replay.c | 6 +--
23 files changed, 210 insertions(+), 61 deletions(-)
Changeset truncated at 500 lines:
diff --git a/lib/pam_wrapper/python/pypamtest.c b/lib/pam_wrapper/python/pypamtest.c
index a71fd35..e25900f 100644
--- a/lib/pam_wrapper/python/pypamtest.c
+++ b/lib/pam_wrapper/python/pypamtest.c
@@ -24,8 +24,8 @@
#define PYTHON_MODULE_NAME "pypamtest"
#ifndef discard_const_p
-#if defined(__intptr_t_defined) || defined(HAVE_INTPTR_T)
-# define discard_const_p(type, ptr) ((type *)((intptr_t)(ptr)))
+#if defined(__intptr_t_defined) || defined(HAVE_UINTPTR_T)
+# define discard_const_p(type, ptr) ((type *)((uintptr_t)(ptr)))
#else
# define discard_const_p(type, ptr) ((type *)(ptr))
#endif
@@ -67,9 +67,9 @@ static PyObject *PyExc_PamTestError;
*** helper functions
**********************************************************/
-static const char *repr_fmt = "{ pam_operation [%d] "
- "expected_rv [%d] "
- "flags [%d] }";
+#define REPR_FMT "{ pam_operation [%d] " \
+ "expected_rv [%d] " \
+ "flags [%d] }"
static char *py_strdup(const char *string)
{
@@ -267,7 +267,7 @@ set_pypamtest_exception(PyObject *exc,
size_t num_tests)
{
PyObject *obj = NULL;
- /* repr_fmt is fixed and contains just %d expansions, so this is safe */
+ /* REPR_FMT contains just %d expansions, so this is safe */
char test_repr[256] = { '\0' };
union {
char *str;
@@ -286,7 +286,7 @@ set_pypamtest_exception(PyObject *exc,
if (perr == PAMTEST_ERR_CASE) {
failed = _pamtest_failed_case(tests, num_tests);
if (failed) {
- snprintf(test_repr, sizeof(test_repr), repr_fmt,
+ snprintf(test_repr, sizeof(test_repr), REPR_FMT,
failed->pam_operation,
failed->expected_rv,
failed->flags);
@@ -422,7 +422,7 @@ static int TestCase_init(TestCaseObject *self,
*/
static PyObject *TestCase_repr(TestCaseObject *self)
{
- return PyUnicode_FromFormat(repr_fmt,
+ return PyUnicode_FromFormat(REPR_FMT,
self->pam_operation,
self->expected_rv,
self->flags);
diff --git a/lib/replace/system/readline.h b/lib/replace/system/readline.h
index e6b8fb9..5dc3e75 100644
--- a/lib/replace/system/readline.h
+++ b/lib/replace/system/readline.h
@@ -26,6 +26,9 @@
#ifdef HAVE_LIBREADLINE
# ifdef HAVE_READLINE_READLINE_H
+# ifdef HAVE_READLINE_READLINE_WORKAROUND
+# define _FUNCTION_DEF
+# endif
# include <readline/readline.h>
# ifdef HAVE_READLINE_HISTORY_H
# include <readline/history.h>
diff --git a/libcli/smbreadline/wscript_configure b/libcli/smbreadline/wscript_configure
index b4d1be2..912ff53 100644
--- a/libcli/smbreadline/wscript_configure
+++ b/libcli/smbreadline/wscript_configure
@@ -7,8 +7,38 @@ for termlib in ['ncurses', 'curses', 'termcap', 'terminfo', 'termlib', 'tinfo']:
conf.env['READLINE_TERMLIB'] = termlib
break
+#
+# Check if we need to work around readline/readline.h
+# deprecated declarations
+#
+if conf.CONFIG_SET('HAVE_READLINE_READLINE_H'):
+ if not conf.CHECK_CODE('''
+ #include <readline/readline.h>
+ int main() {return 0;}
+ ''',
+ define='HAVE_WORKING_READLINE_READLINE_WITH_STRICT_PROTO',
+ cflags=conf.env['WERROR_CFLAGS'] +
+ ['-Wstrict-prototypes',
+ '-Werror=strict-prototypes'],
+ msg='for compiling <readline/readline.h> with strict prototypes',
+ addmain=False):
+ conf.CHECK_CODE('''
+ #define _FUNCTION_DEF
+ #include <readline/readline.h>
+ int main() {return 0;}
+ ''',
+ cflags=conf.env['WERROR_CFLAGS'] +
+ ['-Wstrict-prototypes',
+ '-Werror=strict-prototypes'],
+ msg='for workaround to <readline/readline.h> strict prototypes issue',
+ define='HAVE_READLINE_READLINE_WORKAROUND',
+ addmain=False)
+
conf.CHECK_CODE('''
#ifdef HAVE_READLINE_READLINE_H
+# ifdef HAVE_READLINE_READLINE_WORKAROUND
+# define _FUNCTION_DEF
+# endif
# include <readline/readline.h>
# ifdef HAVE_READLINE_HISTORY_H
# include <readline/history.h>
@@ -28,6 +58,9 @@ msg='Checking for rl_completion_t')
conf.CHECK_CODE('''
#ifdef HAVE_READLINE_READLINE_H
+# ifdef HAVE_READLINE_READLINE_WORKAROUND
+# define _FUNCTION_DEF
+# endif
# include <readline/readline.h>
# ifdef HAVE_READLINE_HISTORY_H
# include <readline/history.h>
diff --git a/nsswitch/pam_winbind.c b/nsswitch/pam_winbind.c
index 4ae6464..3723b17 100644
--- a/nsswitch/pam_winbind.c
+++ b/nsswitch/pam_winbind.c
@@ -671,7 +671,7 @@ static int converse(const pam_handle_t *pamh,
struct pam_response **response)
{
int retval;
- struct pam_conv *conv;
+ const struct pam_conv *conv;
retval = pam_get_item(pamh, PAM_CONV, (const void **) &conv);
if (retval == PAM_SUCCESS) {
@@ -2993,7 +2993,7 @@ static bool _pam_require_krb5_auth_after_chauthtok(struct pwb_context *ctx,
* --- BoYang
* */
- char *new_authtok_reqd_during_auth = NULL;
+ const char *new_authtok_reqd_during_auth = NULL;
struct passwd *pwd = NULL;
pam_get_data(ctx->pamh, PAM_WINBIND_NEW_AUTHTOK_REQD_DURING_AUTH,
diff --git a/nsswitch/winbind_nss_freebsd.c b/nsswitch/winbind_nss_freebsd.c
index 476349f..e283872 100644
--- a/nsswitch/winbind_nss_freebsd.c
+++ b/nsswitch/winbind_nss_freebsd.c
@@ -129,8 +129,13 @@ __freebsd_getgroupmembership(void *retval, void *mdata, va_list ap)
/* insert primary membership(possibly already there) */
gr_addgid(group, groups, maxgrp, groupc);
/* Don't limit number of groups, we want to know total size */
- ret = _nss_winbind_initgroups_dyn(uname, group, &lcount, &lsize,
- &tmpgroups, 0, &errnop);
+ ret = _nss_winbind_initgroups_dyn(discard_const(uname),
+ group,
+ &lcount,
+ &lsize,
+ &tmpgroups,
+ 0,
+ &errnop);
if (ret == NSS_STATUS_SUCCESS) {
/* lcount potentially can be bigger than maxgrp, so would groupc */
for (i = 0; i < lcount; i++)
diff --git a/python/samba/tests/registry.py b/python/samba/tests/registry.py
index 1a8a126..f6af5f7 100644
--- a/python/samba/tests/registry.py
+++ b/python/samba/tests/registry.py
@@ -56,7 +56,11 @@ class HiveTests(samba.tests.TestCaseInTempDir):
self.assertIsNone(self.hive.set_value('foo2', 1, 'bar2'))
self.assertIsNone(self.hive.flush())
- proc = Popen(['bin/tdbdump', self.hive_path], stdout=PIPE, stderr=PIPE)
+ tdbdump_tool = 'tdbdump'
+ if os.path.isfile('bin/tdbdump'):
+ tdbdump_tool = 'bin/tdbdump'
+
+ proc = Popen([tdbdump_tool, self.hive_path], stdout=PIPE, stderr=PIPE)
tdb_dump, err = proc.communicate()
self.assertTrue(b'DN=VALUE=FOO2,HIVE=NONE' in tdb_dump)
diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c
index b847159..fbe1715 100644
--- a/source3/modules/vfs_full_audit.c
+++ b/source3/modules/vfs_full_audit.c
@@ -521,6 +521,9 @@ static TALLOC_CTX *do_log_ctx(void)
}
static void do_log(vfs_op_type op, bool success, vfs_handle_struct *handle,
+ const char *format, ...) PRINTF_ATTRIBUTE(4, 5);
+
+static void do_log(vfs_op_type op, bool success, vfs_handle_struct *handle,
const char *format, ...)
{
struct vfs_full_audit_private_data *pd;
@@ -1411,7 +1414,7 @@ static uint64_t smb_full_audit_get_alloc_size(vfs_handle_struct *handle,
result = SMB_VFS_NEXT_GET_ALLOC_SIZE(handle, fsp, sbuf);
do_log(SMB_VFS_OP_GET_ALLOC_SIZE, (result != (uint64_t)-1), handle,
- "%llu", result);
+ "%llu", (unsigned long long)result);
return result;
}
@@ -1783,7 +1786,10 @@ static NTSTATUS smb_full_audit_brl_lock_windows(struct vfs_handle_struct *handle
do_log(SMB_VFS_OP_BRL_LOCK_WINDOWS, NT_STATUS_IS_OK(result), handle,
"%s:%llu-%llu. type=%d. blocking=%d",
fsp_str_do_log(brl_fsp(br_lck)),
- plock->start, plock->size, plock->lock_type, blocking_lock);
+ (unsigned long long)plock->start,
+ (unsigned long long)plock->size,
+ plock->lock_type,
+ blocking_lock);
return result;
}
@@ -1800,8 +1806,9 @@ static bool smb_full_audit_brl_unlock_windows(struct vfs_handle_struct *handle,
do_log(SMB_VFS_OP_BRL_UNLOCK_WINDOWS, (result == 0), handle,
"%s:%llu-%llu:%d", fsp_str_do_log(brl_fsp(br_lck)),
- plock->start,
- plock->size, plock->lock_type);
+ (unsigned long long)plock->start,
+ (unsigned long long)plock->size,
+ plock->lock_type);
return result;
}
@@ -1816,8 +1823,9 @@ static bool smb_full_audit_brl_cancel_windows(struct vfs_handle_struct *handle,
do_log(SMB_VFS_OP_BRL_CANCEL_WINDOWS, (result == 0), handle,
"%s:%llu-%llu:%d", fsp_str_do_log(brl_fsp(br_lck)),
- plock->start,
- plock->size, plock->lock_type);
+ (unsigned long long)plock->start,
+ (unsigned long long)plock->size,
+ plock->lock_type);
return result;
}
@@ -1831,8 +1839,10 @@ static bool smb_full_audit_strict_lock_check(struct vfs_handle_struct *handle,
result = SMB_VFS_NEXT_STRICT_LOCK_CHECK(handle, fsp, plock);
do_log(SMB_VFS_OP_STRICT_LOCK_CHECK, result, handle,
- "%s:%llu-%llu:%d", fsp_str_do_log(fsp), plock->start,
- plock->size, plock->lock_type);
+ "%s:%llu-%llu:%d", fsp_str_do_log(fsp),
+ (unsigned long long)plock->start,
+ (unsigned long long)plock->size,
+ plock->lock_type);
return result;
}
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index f3da67c..5a29f79 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -1478,7 +1478,8 @@ static bool tcon_devtest(struct cli_state *cli,
if (NT_STATUS_IS_OK(expected_error)) {
if (NT_STATUS_IS_OK(status)) {
- if (strcmp(cli->dev, return_devtype) == 0) {
+ if (return_devtype != NULL &&
+ strequal(cli->dev, return_devtype)) {
ret = True;
} else {
printf("tconX to share %s with type %s "
diff --git a/source4/dsdb/pydsdb.c b/source4/dsdb/pydsdb.c
index 09623a6..4d811b0 100644
--- a/source4/dsdb/pydsdb.c
+++ b/source4/dsdb/pydsdb.c
@@ -919,7 +919,7 @@ static PyObject *py_dsdb_set_schema_from_ldb(PyObject *self, PyObject *args)
struct ldb_context *from_ldb;
struct dsdb_schema *schema;
int ret;
- char write_indices_and_attributes = true;
+ char write_indices_and_attributes = SCHEMA_WRITE;
if (!PyArg_ParseTuple(args, "OO|b",
&py_ldb, &py_from_ldb, &write_indices_and_attributes))
return NULL;
diff --git a/source4/dsdb/repl/replicated_objects.c b/source4/dsdb/repl/replicated_objects.c
index d9365ae..0c44960 100644
--- a/source4/dsdb/repl/replicated_objects.c
+++ b/source4/dsdb/repl/replicated_objects.c
@@ -867,7 +867,7 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
cur_schema = dsdb_get_schema(ldb, tmp_ctx);
used_global_schema = dsdb_uses_global_schema(ldb);
- ret = dsdb_reference_schema(ldb, working_schema, false);
+ ret = dsdb_reference_schema(ldb, working_schema, SCHEMA_MEMORY_ONLY);
if (ret != LDB_SUCCESS) {
DEBUG(0,(__location__ "Failed to reference working schema - %s\n",
ldb_strerror(ret)));
@@ -884,7 +884,7 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
if (used_global_schema) {
dsdb_set_global_schema(ldb);
} else if (cur_schema) {
- dsdb_reference_schema(ldb, cur_schema, false);
+ dsdb_reference_schema(ldb, cur_schema, SCHEMA_MEMORY_ONLY);
}
if (W_ERROR_EQUAL(objects->error, WERR_DS_DRA_RECYCLED_TARGET)) {
@@ -917,7 +917,7 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
if (used_global_schema) {
dsdb_set_global_schema(ldb);
} else if (cur_schema ) {
- dsdb_reference_schema(ldb, cur_schema, false);
+ dsdb_reference_schema(ldb, cur_schema, SCHEMA_MEMORY_ONLY);
}
DEBUG(0,("Failed to save updated prefixMap: %s\n",
win_errstr(werr)));
@@ -932,7 +932,7 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
if (used_global_schema) {
dsdb_set_global_schema(ldb);
} else if (cur_schema ) {
- dsdb_reference_schema(ldb, cur_schema, false);
+ dsdb_reference_schema(ldb, cur_schema, SCHEMA_MEMORY_ONLY);
}
DEBUG(0,(__location__ " Failed to prepare commit of transaction: %s\n",
ldb_errstring(ldb)));
@@ -946,7 +946,7 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
if (used_global_schema) {
dsdb_set_global_schema(ldb);
} else if (cur_schema ) {
- dsdb_reference_schema(ldb, cur_schema, false);
+ dsdb_reference_schema(ldb, cur_schema, SCHEMA_MEMORY_ONLY);
}
DEBUG(0,(__location__ " Failed to load partition uSN\n"));
ldb_transaction_cancel(ldb);
@@ -960,7 +960,7 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
if (used_global_schema) {
dsdb_set_global_schema(ldb);
} else if (cur_schema ) {
- dsdb_reference_schema(ldb, cur_schema, false);
+ dsdb_reference_schema(ldb, cur_schema, SCHEMA_MEMORY_ONLY);
}
DEBUG(0,(__location__ " Failed to commit transaction\n"));
TALLOC_FREE(tmp_ctx);
@@ -1005,7 +1005,7 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
new_schema != NULL ?
new_schema->metadata_usn : 0,
working_schema, working_schema->metadata_usn);
- dsdb_reference_schema(ldb, cur_schema, false);
+ dsdb_reference_schema(ldb, cur_schema, SCHEMA_MEMORY_ONLY);
if (used_global_schema) {
dsdb_set_global_schema(ldb);
}
diff --git a/source4/dsdb/samdb/ldb_modules/schema_load.c b/source4/dsdb/samdb/ldb_modules/schema_load.c
index b3313b4..4013cdf 100644
--- a/source4/dsdb/samdb/ldb_modules/schema_load.c
+++ b/source4/dsdb/samdb/ldb_modules/schema_load.c
@@ -246,7 +246,7 @@ static struct dsdb_schema *dsdb_schema_refresh(struct ldb_module *module, struct
return schema;
}
- ret = dsdb_set_schema(ldb, new_schema, false);
+ ret = dsdb_set_schema(ldb, new_schema, SCHEMA_MEMORY_ONLY);
if (ret != LDB_SUCCESS) {
ldb_debug_set(ldb, LDB_DEBUG_FATAL,
"dsdb_set_schema() failed: %d:%s: %s",
@@ -359,7 +359,8 @@ failed:
}
static int schema_load(struct ldb_context *ldb,
- struct ldb_module *module)
+ struct ldb_module *module,
+ bool *need_write)
{
struct dsdb_schema *schema;
void *readOnlySchema;
@@ -406,7 +407,7 @@ static int schema_load(struct ldb_context *ldb,
}
/* "dsdb_set_schema()" steals schema into the ldb_context */
- ret = dsdb_set_schema(ldb, new_schema, false);
+ ret = dsdb_set_schema(ldb, new_schema, SCHEMA_MEMORY_ONLY);
if (ret != LDB_SUCCESS) {
ldb_debug_set(ldb, LDB_DEBUG_FATAL,
"schema_load_init: dsdb_set_schema() failed: %d:%s: %s",
@@ -444,7 +445,14 @@ static int schema_load(struct ldb_context *ldb,
/* Now check the @INDEXLIST is correct, or fix it up */
ret = dsdb_schema_set_indices_and_attributes(ldb, schema,
- true);
+ SCHEMA_COMPARE);
+ if (ret == LDB_ERR_BUSY) {
+ *need_write = true;
+ ret = LDB_SUCCESS;
+ } else {
+ *need_write = false;
+ }
+
if (ret != LDB_SUCCESS) {
ldb_asprintf_errstring(ldb, "Failed to update "
"@INDEXLIST and @ATTRIBUTES "
@@ -463,6 +471,7 @@ static int schema_load_init(struct ldb_module *module)
struct ldb_context *ldb = ldb_module_get_ctx(module);
struct schema_load_private_data *private_data;
int ret;
+ bool need_write = false;
private_data = talloc_zero(module, struct schema_load_private_data);
if (private_data == NULL) {
@@ -477,11 +486,49 @@ static int schema_load_init(struct ldb_module *module)
return ret;
}
- ret = schema_load(ldb, module);
- if (ret != LDB_SUCCESS) {
- return ret;
+ ret = schema_load(ldb, module, &need_write);
+
+ if (ret == LDB_SUCCESS && need_write) {
+ TALLOC_CTX *frame = talloc_stackframe();
+ struct dsdb_schema *schema = NULL;
+
+ ret = ldb_transaction_start(ldb);
+ if (ret != LDB_SUCCESS) {
+ ldb_debug_set(ldb, LDB_DEBUG_FATAL,
+ "schema_load_init: transaction start failed");
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+
+ schema = dsdb_get_schema(ldb, frame);
+ if (schema == NULL) {
+ ldb_debug_set(ldb, LDB_DEBUG_FATAL,
+ "schema_load_init: dsdb_get_schema failed");
+ ldb_transaction_cancel(ldb);
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+ ret = dsdb_schema_set_indices_and_attributes(ldb, schema,
+ SCHEMA_WRITE);
+
+ TALLOC_FREE(frame);
+
+ if (ret != LDB_SUCCESS) {
+ ldb_asprintf_errstring(ldb, "Failed to write new "
+ "@INDEXLIST and @ATTRIBUTES "
+ "records for updated schema: %s",
+ ldb_errstring(ldb));
+ ldb_transaction_cancel(ldb);
+ return ret;
+ }
+
+ ret = ldb_transaction_commit(ldb);
+ if (ret != LDB_SUCCESS) {
+ ldb_debug_set(ldb, LDB_DEBUG_FATAL,
+ "schema_load_init: transaction commit failed");
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
}
+
return ret;
}
@@ -549,7 +596,7 @@ static int schema_load_extended(struct ldb_module *module, struct ldb_request *r
ret = dsdb_schema_set_indices_and_attributes(ldb,
schema,
- true);
+ SCHEMA_WRITE);
if (ret != LDB_SUCCESS) {
ldb_asprintf_errstring(ldb, "Failed to write new "
diff --git a/source4/dsdb/schema/schema.h b/source4/dsdb/schema/schema.h
index 75e4886..9b27fd2 100644
--- a/source4/dsdb/schema/schema.h
+++ b/source4/dsdb/schema/schema.h
@@ -192,6 +192,12 @@ struct dsdb_class {
} tmp;
};
+enum schema_set_enum {
+ SCHEMA_MEMORY_ONLY = 0,
+ SCHEMA_WRITE = 1,
+ SCHEMA_COMPARE = 2,
+};
+
/**
* data stored in schemaInfo attribute
*/
diff --git a/source4/dsdb/schema/schema_set.c b/source4/dsdb/schema/schema_set.c
index ca7a307..226e31e 100644
--- a/source4/dsdb/schema/schema_set.c
+++ b/source4/dsdb/schema/schema_set.c
@@ -58,7 +58,7 @@ const struct ldb_schema_attribute *dsdb_attribute_handler_override(struct ldb_co
*/
int dsdb_schema_set_indices_and_attributes(struct ldb_context *ldb,
struct dsdb_schema *schema,
- bool write_indices_and_attributes)
+ enum schema_set_enum mode)
{
int ret = LDB_SUCCESS;
struct ldb_result *res;
@@ -80,7 +80,7 @@ int dsdb_schema_set_indices_and_attributes(struct ldb_context *ldb,
ldb_schema_set_override_GUID_index(ldb, "objectGUID", "GUID");
}
- if (!write_indices_and_attributes) {
--
Samba Shared Repository
More information about the samba-cvs
mailing list