The branch, master has been updated
       via  51a7154 nsswitch: add ABI checking and symbol versions to 
libwbclient
       via  fdd07e8 s4-dsdb: Explain better what records are written during 
schema set
       via  1d1bdc3 lib/ldb: Use tdb_parse_record and a callback rather than 
tdb_fetch()
      from  a5495bc Remove smb_panic() from unix_strlower(). Just rely on error 
code return.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 51a71547ef0c883970e9ef86a33c42e1b815cc4d
Author: Andrew Bartlett <abart...@samba.org>
Date:   Fri Aug 10 10:17:31 2012 +1000

    nsswitch: add ABI checking and symbol versions to libwbclient
    
    This will ensure that we do not unintentionally break the ABI.
    
    Andrew Bartlett
    
    Autobuild-User(master): Andrew Bartlett <abart...@samba.org>
    Autobuild-Date(master): Fri Aug 10 04:08:54 CEST 2012 on sn-devel-104

commit fdd07e87c6fc7a4a0ea7c6f99080d78e526042e6
Author: Andrew Bartlett <abart...@samba.org>
Date:   Fri Aug 10 08:44:04 2012 +1000

    s4-dsdb: Explain better what records are written during schema set
    
    This is controlled by setting write_indices_and_attributes.
    
    Andrew Bartlett

commit 1d1bdc315b4619f0ca5b2a0db602cbe283f8dca8
Author: Andrew Bartlett <abart...@samba.org>
Date:   Thu Aug 9 22:46:48 2012 +1000

    lib/ldb: Use tdb_parse_record and a callback rather than tdb_fetch()
    
    This avoid allocation at the tdb layer as we will allocate this
    with talloc right away anyway.
    
    Andrew Bartlett

-----------------------------------------------------------------------

Summary of changes:
 lib/ldb/ldb_tdb/ldb_search.c                       |   54 ++++++++++----
 nsswitch/libwbclient/ABI/wbclient-0.9.sigs         |   75 ++++++++++++++++++++
 nsswitch/libwbclient/wscript                       |    3 +
 source4/dsdb/pydsdb.c                              |    6 +-
 source4/dsdb/schema/schema_set.c                   |   23 ++++--
 .../scripting/python/samba/provision/__init__.py   |    6 +-
 source4/scripting/python/samba/samdb.py            |    8 +-
 7 files changed, 142 insertions(+), 33 deletions(-)
 create mode 100644 nsswitch/libwbclient/ABI/wbclient-0.9.sigs


Changeset truncated at 500 lines:

diff --git a/lib/ldb/ldb_tdb/ldb_search.c b/lib/ldb/ldb_tdb/ldb_search.c
index e631f7b..703ad6a 100644
--- a/lib/ldb/ldb_tdb/ldb_search.c
+++ b/lib/ldb/ldb_tdb/ldb_search.c
@@ -234,6 +234,26 @@ static int ltdb_search_base(struct ldb_module *module, 
struct ldb_dn *dn)
        return LDB_ERR_NO_SUCH_OBJECT;
 }
 
+struct ltdb_parse_data_unpack_ctx {
+       struct ldb_message *msg;
+       struct ldb_module *module;
+};
+
+static int ltdb_parse_data_unpack(TDB_DATA key, TDB_DATA data,
+                                 void *private_data)
+{
+       struct ltdb_parse_data_unpack_ctx *ctx = private_data;
+
+       int ret = ltdb_unpack_data(ctx->module, &data, ctx->msg);
+       if (ret == -1) {
+               struct ldb_context *ldb = ldb_module_get_ctx(ctx->module);
+               ldb_debug(ldb, LDB_DEBUG_ERROR, "Invalid data for index 
%*.*s\n",
+                         (int)key.dsize, (int)key.dsize, key.dptr);
+               return LDB_ERR_OPERATIONS_ERROR;                
+       }
+       return ret;
+}
+
 /*
   search the database for a single simple dn, returning all attributes
   in a single message
@@ -246,9 +266,11 @@ int ltdb_search_dn1(struct ldb_module *module, struct 
ldb_dn *dn, struct ldb_mes
        void *data = ldb_module_get_private(module);
        struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
        int ret;
-       TDB_DATA tdb_key, tdb_data;
-
-       memset(msg, 0, sizeof(*msg));
+       TDB_DATA tdb_key;
+       struct ltdb_parse_data_unpack_ctx ctx = {
+               .msg = msg,
+               .module = module
+       };
 
        /* form the key */
        tdb_key = ltdb_key(module, dn);
@@ -256,24 +278,24 @@ int ltdb_search_dn1(struct ldb_module *module, struct 
ldb_dn *dn, struct ldb_mes
                return LDB_ERR_OPERATIONS_ERROR;
        }
 
-       tdb_data = tdb_fetch(ltdb->tdb, tdb_key);
-       talloc_free(tdb_key.dptr);
-       if (!tdb_data.dptr) {
-               return LDB_ERR_NO_SUCH_OBJECT;
-       }
-       
+       memset(msg, 0, sizeof(*msg));
+
        msg->num_elements = 0;
        msg->elements = NULL;
 
-       ret = ltdb_unpack_data(module, &tdb_data, msg);
-       free(tdb_data.dptr);
+       ret = tdb_parse_record(ltdb->tdb, tdb_key, 
+                              ltdb_parse_data_unpack, &ctx); 
+       talloc_free(tdb_key.dptr);
+       
        if (ret == -1) {
-               struct ldb_context *ldb = ldb_module_get_ctx(module);
-               ldb_debug(ldb, LDB_DEBUG_ERROR, "Invalid data for index %s\n",
-                         ldb_dn_get_linearized(msg->dn));
-               return LDB_ERR_OPERATIONS_ERROR;                
+               if (tdb_error(ltdb->tdb) == TDB_ERR_NOEXIST) {
+                       return LDB_ERR_NO_SUCH_OBJECT;
+               }
+               return LDB_ERR_OPERATIONS_ERROR;
+       } else if (ret != LDB_SUCCESS) {
+               return ret;
        }
-
+       
        if (!msg->dn) {
                msg->dn = ldb_dn_copy(msg, dn);
        }
diff --git a/nsswitch/libwbclient/ABI/wbclient-0.9.sigs 
b/nsswitch/libwbclient/ABI/wbclient-0.9.sigs
new file mode 100644
index 0000000..ec25e76
--- /dev/null
+++ b/nsswitch/libwbclient/ABI/wbclient-0.9.sigs
@@ -0,0 +1,75 @@
+wbcAddNamedBlob: wbcErr (size_t *, struct wbcNamedBlob **, const char *, 
uint32_t, uint8_t *, size_t)
+wbcAllocateGid: wbcErr (gid_t *)
+wbcAllocateMemory: void *(size_t, size_t, void (*)(void *))
+wbcAllocateStringArray: const char **(int)
+wbcAllocateUid: wbcErr (uid_t *)
+wbcAuthenticateUser: wbcErr (const char *, const char *)
+wbcAuthenticateUserEx: wbcErr (const struct wbcAuthUserParams *, struct 
wbcAuthUserInfo **, struct wbcAuthErrorInfo **)
+wbcChangeTrustCredentials: wbcErr (const char *, struct wbcAuthErrorInfo **)
+wbcChangeUserPassword: wbcErr (const char *, const char *, const char *)
+wbcChangeUserPasswordEx: wbcErr (const struct wbcChangePasswordParams *, 
struct wbcAuthErrorInfo **, enum wbcPasswordChangeRejectReason *, struct 
wbcUserPasswordPolicyInfo **)
+wbcCheckTrustCredentials: wbcErr (const char *, struct wbcAuthErrorInfo **)
+wbcCredentialCache: wbcErr (struct wbcCredentialCacheParams *, struct 
wbcCredentialCacheInfo **, struct wbcAuthErrorInfo **)
+wbcCredentialSave: wbcErr (const char *, const char *)
+wbcDcInfo: wbcErr (const char *, size_t *, const char ***, const char ***)
+wbcDomainInfo: wbcErr (const char *, struct wbcDomainInfo **)
+wbcEndgrent: wbcErr (void)
+wbcEndpwent: wbcErr (void)
+wbcErrorString: const char *(wbcErr)
+wbcFreeMemory: void (void *)
+wbcGetDisplayName: wbcErr (const struct wbcDomainSid *, char **, char **, enum 
wbcSidType *)
+wbcGetGroups: wbcErr (const char *, uint32_t *, gid_t **)
+wbcGetSidAliases: wbcErr (const struct wbcDomainSid *, struct wbcDomainSid *, 
uint32_t, uint32_t **, uint32_t *)
+wbcGetgrent: wbcErr (struct group **)
+wbcGetgrgid: wbcErr (gid_t, struct group **)
+wbcGetgrlist: wbcErr (struct group **)
+wbcGetgrnam: wbcErr (const char *, struct group **)
+wbcGetpwent: wbcErr (struct passwd **)
+wbcGetpwnam: wbcErr (const char *, struct passwd **)
+wbcGetpwsid: wbcErr (struct wbcDomainSid *, struct passwd **)
+wbcGetpwuid: wbcErr (uid_t, struct passwd **)
+wbcGidToSid: wbcErr (gid_t, struct wbcDomainSid *)
+wbcGuidToString: wbcErr (const struct wbcGuid *, char **)
+wbcInterfaceDetails: wbcErr (struct wbcInterfaceDetails **)
+wbcLibraryDetails: wbcErr (struct wbcLibraryDetails **)
+wbcListGroups: wbcErr (const char *, uint32_t *, const char ***)
+wbcListTrusts: wbcErr (struct wbcDomainInfo **, size_t *)
+wbcListUsers: wbcErr (const char *, uint32_t *, const char ***)
+wbcLogoffUser: wbcErr (const char *, uid_t, const char *)
+wbcLogoffUserEx: wbcErr (const struct wbcLogoffUserParams *, struct 
wbcAuthErrorInfo **)
+wbcLogonUser: wbcErr (const struct wbcLogonUserParams *, struct 
wbcLogonUserInfo **, struct wbcAuthErrorInfo **, struct 
wbcUserPasswordPolicyInfo **)
+wbcLookupDomainController: wbcErr (const char *, uint32_t, struct 
wbcDomainControllerInfo **)
+wbcLookupDomainControllerEx: wbcErr (const char *, struct wbcGuid *, const 
char *, uint32_t, struct wbcDomainControllerInfoEx **)
+wbcLookupName: wbcErr (const char *, const char *, struct wbcDomainSid *, enum 
wbcSidType *)
+wbcLookupRids: wbcErr (struct wbcDomainSid *, int, uint32_t *, const char **, 
const char ***, enum wbcSidType **)
+wbcLookupSid: wbcErr (const struct wbcDomainSid *, char **, char **, enum 
wbcSidType *)
+wbcLookupSids: wbcErr (const struct wbcDomainSid *, int, struct wbcDomainInfo 
**, int *, struct wbcTranslatedName **)
+wbcLookupUserSids: wbcErr (const struct wbcDomainSid *, bool, uint32_t *, 
struct wbcDomainSid **)
+wbcPing: wbcErr (void)
+wbcPingDc: wbcErr (const char *, struct wbcAuthErrorInfo **)
+wbcQueryGidToSid: wbcErr (gid_t, struct wbcDomainSid *)
+wbcQuerySidToGid: wbcErr (const struct wbcDomainSid *, gid_t *)
+wbcQuerySidToUid: wbcErr (const struct wbcDomainSid *, uid_t *)
+wbcQueryUidToSid: wbcErr (uid_t, struct wbcDomainSid *)
+wbcRemoveGidMapping: wbcErr (gid_t, const struct wbcDomainSid *)
+wbcRemoveUidMapping: wbcErr (uid_t, const struct wbcDomainSid *)
+wbcRequestResponse: wbcErr (int, struct winbindd_request *, struct 
winbindd_response *)
+wbcRequestResponsePriv: wbcErr (int, struct winbindd_request *, struct 
winbindd_response *)
+wbcResolveWinsByIP: wbcErr (const char *, char **)
+wbcResolveWinsByName: wbcErr (const char *, char **)
+wbcSetGidHwm: wbcErr (gid_t)
+wbcSetGidMapping: wbcErr (gid_t, const struct wbcDomainSid *)
+wbcSetUidHwm: wbcErr (uid_t)
+wbcSetUidMapping: wbcErr (uid_t, const struct wbcDomainSid *)
+wbcSetgrent: wbcErr (void)
+wbcSetpwent: wbcErr (void)
+wbcSidToGid: wbcErr (const struct wbcDomainSid *, gid_t *)
+wbcSidToString: wbcErr (const struct wbcDomainSid *, char **)
+wbcSidToStringBuf: int (const struct wbcDomainSid *, char *, int)
+wbcSidToUid: wbcErr (const struct wbcDomainSid *, uid_t *)
+wbcSidTypeString: const char *(enum wbcSidType)
+wbcSidsToUnixIds: wbcErr (const struct wbcDomainSid *, uint32_t, struct 
wbcUnixId *)
+wbcStrDup: char *(const char *)
+wbcStringToGuid: wbcErr (const char *, struct wbcGuid *)
+wbcStringToSid: wbcErr (const char *, struct wbcDomainSid *)
+wbcUidToSid: wbcErr (uid_t, struct wbcDomainSid *)
diff --git a/nsswitch/libwbclient/wscript b/nsswitch/libwbclient/wscript
index 6b9c99c..8f7b704 100644
--- a/nsswitch/libwbclient/wscript
+++ b/nsswitch/libwbclient/wscript
@@ -27,6 +27,7 @@ def build(bld):
 #
 #    Logs.info("\tSelected embedded libwbclient build")
 
+    abi_match = 'wbc*'
     bld.SAMBA_LIBRARY('wbclient',
                       source='''
                              wbc_guid.c
@@ -39,4 +40,6 @@ def build(bld):
                       deps='winbind-client',
                       pc_files='wbclient.pc',
                       public_headers='wbclient.h',
+                      abi_directory='ABI',
+                      abi_match=abi_match,
                       vnum=VERSION)
diff --git a/source4/dsdb/pydsdb.c b/source4/dsdb/pydsdb.c
index 9023d69..39229f4 100644
--- a/source4/dsdb/pydsdb.c
+++ b/source4/dsdb/pydsdb.c
@@ -873,9 +873,9 @@ 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_attributes = true;
+       char write_indices_and_attributes = true;
        if (!PyArg_ParseTuple(args, "OO|b",
-                             &py_ldb, &py_from_ldb, &write_attributes))
+                             &py_ldb, &py_from_ldb, 
&write_indices_and_attributes))
                return NULL;
 
        PyErr_LDB_OR_RAISE(py_ldb, ldb);
@@ -888,7 +888,7 @@ static PyObject *py_dsdb_set_schema_from_ldb(PyObject 
*self, PyObject *args)
                return NULL;
        }
 
-       ret = dsdb_reference_schema(ldb, schema, write_attributes);
+       ret = dsdb_reference_schema(ldb, schema, write_indices_and_attributes);
        PyErr_LDB_ERROR_IS_ERR_RAISE(py_ldb_get_exception(), ret, ldb);
 
        Py_RETURN_NONE;
diff --git a/source4/dsdb/schema/schema_set.c b/source4/dsdb/schema/schema_set.c
index 286a8a3..e226118 100644
--- a/source4/dsdb/schema/schema_set.c
+++ b/source4/dsdb/schema/schema_set.c
@@ -50,8 +50,13 @@ const struct ldb_schema_attribute 
*dsdb_attribute_handler_override(struct ldb_co
        }
        return a->ldb_schema_attribute;
 }
-
-static int dsdb_schema_set_attributes(struct ldb_context *ldb, struct 
dsdb_schema *schema, bool write_attributes)
+/*
+ * Set the attribute handlers onto the LDB, and potentially write the
+ * @INDEXLIST, @IDXONE and @ATTRIBUTES records.  The @ATTRIBUTES records
+ * are required so we can operate on a schema-less database (say the
+ * backend during emergency fixes) and during the schema load.
+ */
+static int dsdb_schema_set_indices_and_attributes(struct ldb_context *ldb, 
struct dsdb_schema *schema, bool write_indices_and_attributes)
 {
        int ret = LDB_SUCCESS;
        struct ldb_result *res;
@@ -65,7 +70,7 @@ static int dsdb_schema_set_attributes(struct ldb_context 
*ldb, struct dsdb_schem
        /* setup our own attribute name to schema handler */
        ldb_schema_attribute_set_override_handler(ldb, 
dsdb_attribute_handler_override, schema);
 
-       if (!write_attributes) {
+       if (!write_indices_and_attributes) {
                return ret;
        }
 
@@ -454,7 +459,7 @@ int dsdb_set_schema(struct ldb_context *ldb, struct 
dsdb_schema *schema)
        }
 
        /* Set the new attributes based on the new schema */
-       ret = dsdb_schema_set_attributes(ldb, schema, true);
+       ret = dsdb_schema_set_indices_and_attributes(ldb, schema, true);
        if (ret != LDB_SUCCESS) {
                return ret;
        }
@@ -469,9 +474,13 @@ static struct dsdb_schema *global_schema;
 
 /**
  * Make this ldb use a specified schema, already fully calculated and 
belonging to another ldb
+ *
+ * The write_indices_and_attributes controls writing of the @ records
+ * because we cannot write to a database that does not yet exist on
+ * disk.
  */
 int dsdb_reference_schema(struct ldb_context *ldb, struct dsdb_schema *schema,
-                         bool write_attributes)
+                         bool write_indices_and_attributes)
 {
        int ret;
        struct dsdb_schema *old_schema;
@@ -495,7 +504,7 @@ int dsdb_reference_schema(struct ldb_context *ldb, struct 
dsdb_schema *schema,
                return ret;
        }
 
-       ret = dsdb_schema_set_attributes(ldb, schema, write_attributes);
+       ret = dsdb_schema_set_indices_and_attributes(ldb, schema, 
write_indices_and_attributes);
        if (ret != LDB_SUCCESS) {
                return ret;
        }
@@ -519,7 +528,7 @@ int dsdb_set_global_schema(struct ldb_context *ldb)
        }
 
        /* Set the new attributes based on the new schema */
-       ret = dsdb_schema_set_attributes(ldb, global_schema, false /* Don't 
write attributes, it's expensive */);
+       ret = dsdb_schema_set_indices_and_attributes(ldb, global_schema, false 
/* Don't write indices and attributes, it's expensive */);
        if (ret == LDB_SUCCESS) {
                /* Keep a reference to this schema, just in case the original 
copy is replaced */
                if (talloc_reference(ldb, global_schema) == NULL) {
diff --git a/source4/scripting/python/samba/provision/__init__.py 
b/source4/scripting/python/samba/provision/__init__.py
index 94e857e..6834d40 100644
--- a/source4/scripting/python/samba/provision/__init__.py
+++ b/source4/scripting/python/samba/provision/__init__.py
@@ -1121,7 +1121,7 @@ def setup_samdb(path, session_info, provision_backend, 
lp, names,
     logger.info("Pre-loading the Samba 4 and AD schema")
 
     # Load the schema from the one we computed earlier
-    samdb.set_schema(schema, write_attributes=False)
+    samdb.set_schema(schema, write_indices_and_attributes=False)
 
     # Set the NTDS settings DN manually - in order to have it already around
     # before the provisioned tree exists and we connect
@@ -1133,8 +1133,8 @@ def setup_samdb(path, session_info, provision_backend, 
lp, names,
 
     # But we have to give it one more kick to have it use the schema
     # during provision - it needs, now that it is connected, to write
-    # the schema @INDEX records to the database.
-    samdb.set_schema(schema, write_attributes=True)
+    # the schema @ATTRIBUTES and @INDEXLIST records to the database.
+    samdb.set_schema(schema, write_indices_and_attributes=True)
 
     return samdb
 
diff --git a/source4/scripting/python/samba/samdb.py 
b/source4/scripting/python/samba/samdb.py
index 3355e9a..7db1b00 100644
--- a/source4/scripting/python/samba/samdb.py
+++ b/source4/scripting/python/samba/samdb.py
@@ -608,11 +608,11 @@ accountExpires: %u
     def load_partition_usn(self, base_dn):
         return dsdb._dsdb_load_partition_usn(self, base_dn)
 
-    def set_schema(self, schema, write_attributes=True):
-        self.set_schema_from_ldb(schema.ldb, write_attributes=write_attributes)
+    def set_schema(self, schema, write_indices_and_attributes=True):
+        self.set_schema_from_ldb(schema.ldb, 
write_indices_and_attributes=write_indices_and_attributes)
 
-    def set_schema_from_ldb(self, ldb_conn, write_attributes=True):
-        dsdb._dsdb_set_schema_from_ldb(self, ldb_conn, write_attributes)
+    def set_schema_from_ldb(self, ldb_conn, write_indices_and_attributes=True):
+        dsdb._dsdb_set_schema_from_ldb(self, ldb_conn, 
write_indices_and_attributes)
 
     def dsdb_DsReplicaAttribute(self, ldb, ldap_display_name, ldif_elements):
         '''convert a list of attribute values to a DRSUAPI 
DsReplicaAttribute'''


-- 
Samba Shared Repository

Reply via email to