summaryrefslogtreecommitdiff
path: root/source4/dsdb/samdb/ldb_modules
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2013-05-16 13:52:51 +1000
committerStefan Metzmacher <metze@samba.org>2013-05-28 16:20:08 +0200
commit54e092bb31001879f4d7a49e36a226c27b4d9843 (patch)
tree50290584eaff1b2a8e4461a0b498e7b44f4d7b09 /source4/dsdb/samdb/ldb_modules
parent3bd686c5ad4756af1033ac14ba09a40156cc6d47 (diff)
downloadsamba-54e092bb31001879f4d7a49e36a226c27b4d9843.tar.gz
samba-54e092bb31001879f4d7a49e36a226c27b4d9843.tar.bz2
samba-54e092bb31001879f4d7a49e36a226c27b4d9843.zip
dsdb-linked_attributes: Do not crash if the target GUID can not be found
Note that we must not give an error when we cannot find the object that should hold the backlink, there really isn't anything we can do in this case. Andrew Bartlett Reviewed-by: Stefan Metzmacher <metze@samba.org>
Diffstat (limited to 'source4/dsdb/samdb/ldb_modules')
-rw-r--r--source4/dsdb/samdb/ldb_modules/linked_attributes.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/linked_attributes.c b/source4/dsdb/samdb/ldb_modules/linked_attributes.c
index a55ec87f0f..eb57f91e6d 100644
--- a/source4/dsdb/samdb/ldb_modules/linked_attributes.c
+++ b/source4/dsdb/samdb/ldb_modules/linked_attributes.c
@@ -4,6 +4,7 @@
Copyright (C) Andrew Bartlett <abartlet@samba.org> 2007
Copyright (C) Simo Sorce <idra@samba.org> 2008
Copyright (C) Matthieu Patou <mat@matws.net> 2011
+ Copyright (C) Andrew Tridgell 2009
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
@@ -729,6 +730,20 @@ static int linked_attributes_fix_links(struct ldb_module *module,
talloc_free(tmp_ctx);
return ret;
}
+ if (res->count == 0) {
+ /* Forward link without backlink object remaining - nothing to do here */
+ continue;
+ }
+ if (res->count != 1) {
+ ldb_asprintf_errstring(ldb, "Linked attribute %s->%s between %s and %s - target GUID %s found more than once!",
+ el->name, target->lDAPDisplayName,
+ ldb_dn_get_linearized(old_dn),
+ ldb_dn_get_linearized(dsdb_dn->dn),
+ GUID_string(tmp_ctx, &link_guid));
+ talloc_free(tmp_ctx);
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+
msg = res->msgs[0];
if (msg->num_elements == 0) {