replmd linked attrs: fully parse dn for upgrade check
authorAndrew Bartlett <abartlet@samba.org>
Fri, 3 Feb 2017 02:35:02 +0000 (15:35 +1300)
committerDouglas Bagnall <dbagnall@samba.org>
Thu, 9 Feb 2017 02:17:15 +0000 (03:17 +0100)
Elsewhere we use the dsdb_dn pointer as a flag indicating parsed-ness,
so we have to be consistent.

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source4/dsdb/samdb/ldb_modules/repl_meta_data.c

index bdb1a8d9f8dd0aea42761c90b3b07e82034ce9c4..6b91b4bb5b7e5818677415981058610acdeec346 100644 (file)
@@ -1804,6 +1804,25 @@ struct compare_ctx {
        const struct GUID *invocation_id;
 };
 
+/* When a parsed_dn comes from the database, sometimes it is not really parsed. */
+
+static int really_parse_trusted_dn(TALLOC_CTX *mem_ctx, struct ldb_context *ldb,
+                                  struct parsed_dn *pdn, const char *ldap_oid)
+{
+       NTSTATUS status;
+       struct dsdb_dn *dsdb_dn = dsdb_dn_parse_trusted(mem_ctx, ldb, pdn->v,
+                                                       ldap_oid);
+       if (dsdb_dn == NULL) {
+               return LDB_ERR_INVALID_DN_SYNTAX;
+       }
+
+       status = dsdb_get_extended_dn_guid(dsdb_dn->dn, &pdn->guid, "GUID");
+       if (!NT_STATUS_IS_OK(status)) {
+               return LDB_ERR_OPERATIONS_ERROR;
+       }
+       pdn->dsdb_dn = dsdb_dn;
+       return LDB_SUCCESS;
+}
 
 static int parsed_dn_compare(struct parsed_dn *pdn1, struct parsed_dn *pdn2)
 {
@@ -2167,9 +2186,9 @@ static int replmd_check_upgrade_links(struct ldb_context *ldb,
                uint32_t version;
                int ret;
                if (dns[i].dsdb_dn == NULL) {
-                       dns[i].dsdb_dn = dsdb_dn_parse(dns, ldb, dns[i].v,
-                                                      ldap_oid);
-                       if (dns[i].dsdb_dn == NULL) {
+                       ret = really_parse_trusted_dn(dns, ldb, &dns[i],
+                                                     ldap_oid);
+                       if (ret != LDB_SUCCESS) {
                                return LDB_ERR_INVALID_DN_SYNTAX;
                        }
                }