On Mon, 2014-04-21 at 23:15 +0200, Jakub Hrozek wrote:
> Hi,
> 
> the attached patches implement ticket #2073 -- the possibility to
> extend
> the LDAP attribute map with custom attributes.
> 
> All attributes are saved to sysdb with the 'extra_' prefix so that the
> custom attributes can be distinguished from the sysdb schema.
> 
> The first patch fixes a mostly unrelated bug, which I found when
> writing
> unit tests.
> 
> [PATCH 1/3] LDAP: Fix one-by-one bug in sdap_copy_opts
> The sdap_copy_opts function copied all the arguments except for the
> sentinel.
> 
> [PATCH 2/3] LDAP: Make it possible to extend an attribute map
> https://fedorahosted.org/sssd/ticket/2073
> 
> This commit adds a new option ldap_user_extra_attrs that is unset by
> default. When set, the option contains a list of LDAP attributes the
> LDAP provider would download and store in addition to the usual set.
> 
> The attributes are fetched in sysdb with the 'extra_' prefix to not
> conflict with the sssd sdap maps.
> 
> [PATCH 3/3] Make LDAP extra attributes available to IPA and AD
> https://fedorahosted.org/sssd/ticket/2073


Looks good from 10000 feet, however I saw at least one issue, inline


> 
> From cc4b347c955f93d640772fad197a55a1b9034525 Mon Sep 17 00:00:00 2001
> From: Jakub Hrozek <jhro...@redhat.com>
> Date: Mon, 21 Apr 2014 21:33:36 +0200
> Subject: [PATCH 1/3] LDAP: Fix one-by-one bug in sdap_copy_opts

[..]

>  
> +    /* Include the sentinel */
> +    map[num_entries].def_name = NULL;
> +    map[num_entries].sys_name = NULL;
> +    map[num_entries].opt_name = NULL;
> +    map[num_entries].name     = NULL;

Here you explicitly mark all 4 components as NULL.

[..]

Then in the next patch ...

> From 40329ebff77b0d05c8051d3d4a2af2f6545c8d86 Mon Sep 17 00:00:00 2001
> From: Jakub Hrozek <jhro...@redhat.com>
> Date: Wed, 31 Jul 2013 10:59:43 +0200
> Subject: [PATCH 2/3] LDAP: Make it possible to extend an attribute map


[..]

> +    for (nextra = 0; extra_attrs[nextra]; nextra++) ;
> +    DEBUG(SSSDBG_FUNC_DATA, "%zu extra attributes\n", nextra);

(aside: is this really worth here, you can print it after the next loop
as nextra = i; at less cost)

> +    map = talloc_realloc(memctx, src_map, struct sdap_attr_map,
> +                         num_entries + nextra + 1);
> +    if (map == NULL) {
> +        return ENOMEM;
> +    }
> +
> +    for (i = 0; extra_attrs[i]; i++) {
> +        map[num_entries+i].opt_name = talloc_strdup(map,
> extra_attrs[i]);
> +        map[num_entries+i].sys_name = talloc_asprintf(map,
> +
> SYSDB_EXTRA_ATTR_TMPL,
> +                                                map[num_entries
> +i].opt_name);
> +        map[num_entries+i].name = talloc_strdup(map,
> +                                                map[num_entries
> +i].opt_name);
> +        map[num_entries+i].def_name = talloc_strdup(map,
> +                                                map[num_entries
> +i].opt_name);
> +        if (map[num_entries+i].opt_name == NULL ||
> +            map[num_entries+i].sys_name == NULL ||
> +            map[num_entries+i].name == NULL ||
> +            map[num_entries+i].def_name == NULL) {
> +            return ENOMEM;
> +        }
> +        DEBUG(SSSDBG_TRACE_FUNC, "Extending map with %s\n",
> extra_attrs[i]);
> +    }
> +
> +    /* Sentinel */
> +    map[num_entries+nextra].opt_name = NULL;
> +    map[num_entries+nextra].sys_name = NULL;
> +    map[num_entries+nextra].name = NULL;

HERE ---^^^^ only 3 elements are NULLed, def_name is missing.

I see 2 solutions:
1) only null .name
2) memset(&map[num_entries+nextra], 0, sizeof(struct sdap_attr_map));

They are both fail_safe in case struct sdap_attr_map is changed.


Simo.
> 
> 
-- 
Simo Sorce * Red Hat, Inc * New York

_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to