diff options
author | Stephen Gallagher <sgallagh@redhat.com> | 2012-05-08 13:37:14 -0400 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2012-05-10 11:34:46 -0400 |
commit | ca4b7b92738f3dd463914e3de5757cd98d37a983 (patch) | |
tree | b7b781eabeed9a096fca59df8d836418ac3a41b7 /src/providers/ldap/sdap.c | |
parent | e2a59ba258ab98a6f50a1af627bc4cdceaa59101 (diff) | |
download | sssd-ca4b7b92738f3dd463914e3de5757cd98d37a983.tar.gz sssd-ca4b7b92738f3dd463914e3de5757cd98d37a983.tar.xz sssd-ca4b7b92738f3dd463914e3de5757cd98d37a983.zip |
LDAP: Add attr_count return value to build_attrs_from_map()
This is necessary because in several places in the code, we are
appending to the attrs returned from this value, and if we relied
on the map size macro, we would be appending after the NULL
terminator if one or more attributes were defined as NULL.
Diffstat (limited to 'src/providers/ldap/sdap.c')
-rw-r--r-- | src/providers/ldap/sdap.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/providers/ldap/sdap.c b/src/providers/ldap/sdap.c index 616e7cba5..e4d3aa9bc 100644 --- a/src/providers/ldap/sdap.c +++ b/src/providers/ldap/sdap.c @@ -999,13 +999,22 @@ void sdap_steal_server_opts(struct sdap_id_ctx *id_ctx, int build_attrs_from_map(TALLOC_CTX *memctx, struct sdap_attr_map *map, - size_t size, const char ***_attrs) + size_t size, + const char ***_attrs, + size_t *attr_count) { + errno_t ret; const char **attrs; int i, j; + TALLOC_CTX *tmp_ctx = talloc_new(NULL); + if (!tmp_ctx) return ENOMEM; - attrs = talloc_array(memctx, const char *, size + 1); - if (!attrs) return ENOMEM; + /* Assume that all entries in the map have values */ + attrs = talloc_zero_array(tmp_ctx, const char *, size + 1); + if (!attrs) { + ret = ENOMEM; + goto done; + } /* first attribute is "objectclass" not the specifc one */ attrs[0] = talloc_strdup(memctx, "objectClass"); @@ -1020,9 +1029,21 @@ int build_attrs_from_map(TALLOC_CTX *memctx, } attrs[j] = NULL; - *_attrs = attrs; + /* Trim down the used memory if some attributes were NULL */ + attrs = talloc_realloc(tmp_ctx, attrs, const char *, j + 1); + if (!attrs) { + ret = ENOMEM; + goto done; + } - return EOK; + *_attrs = talloc_steal(memctx, attrs); + if (attr_count) *attr_count = j; + + ret = EOK; + +done: + talloc_free(tmp_ctx); + return ret; } int sdap_control_create(struct sdap_handle *sh, const char *oid, int iscritical, |