summaryrefslogtreecommitdiffstats
path: root/src/providers
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2013-04-12 12:01:01 +0200
committerJakub Hrozek <jhrozek@redhat.com>2013-04-19 14:08:31 +0200
commitf4fddaf1bad5f82920ae3ec2af90b42309472a89 (patch)
tree70d851d3d3c3f040d0df06cabdbe5f8f996d075c /src/providers
parent4f57212955827a9062b150c768e8a0c2fb613193 (diff)
downloadsssd-f4fddaf1bad5f82920ae3ec2af90b42309472a89.tar.gz
sssd-f4fddaf1bad5f82920ae3ec2af90b42309472a89.tar.xz
sssd-f4fddaf1bad5f82920ae3ec2af90b42309472a89.zip
LDAP: do not invalidate pointer with realloc while processing ghost users
https://fedorahosted.org/sssd/ticket/1799 One peculiarity of the sysdb_attrs_get_el interface is that if the attribute does not exist, then the attrs array is reallocated and the element is created. But in case other pointers are already pointing into the array, the realloc might invalidate them. Such case was in the sdap_process_ghost_members function where if the group had no members, the "gh" pointer requested earlier might have been invalidated by the realloc in order to create the member element.
Diffstat (limited to 'src/providers')
-rw-r--r--src/providers/ldap/sdap_async_groups.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/providers/ldap/sdap_async_groups.c b/src/providers/ldap/sdap_async_groups.c
index dbb5037b8..42802f58d 100644
--- a/src/providers/ldap/sdap_async_groups.c
+++ b/src/providers/ldap/sdap_async_groups.c
@@ -319,10 +319,20 @@ sdap_process_ghost_members(struct sysdb_attrs *attrs,
return ret;
}
- ret = sysdb_attrs_get_el(attrs,
+ ret = sysdb_attrs_get_el_ext(attrs,
opts->group_map[SDAP_AT_GROUP_MEMBER].sys_name,
- &memberel);
- if (ret != EOK) {
+ false, &memberel);
+ if (ret == ENOENT) {
+ /* Create a dummy element with no values in order for the loop to just
+ * fall through and make sure the attrs array is not reallocated.
+ */
+ memberel = talloc(attrs, struct ldb_message_element);
+ if (memberel == NULL) {
+ return ENOMEM;
+ }
+ memberel->num_values = 0;
+ memberel->values = NULL;
+ } else if (ret != EOK) {
DEBUG(SSSDBG_MINOR_FAILURE,
("Error reading members: [%s]\n", strerror(ret)));
return ret;