diff options
author | Jan Engelhardt <jengelh@inai.de> | 2013-02-21 13:12:25 +0100 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2013-02-26 17:22:16 +0100 |
commit | 7cd86ef19cdde175f318aeca4ef2530d33158342 (patch) | |
tree | b4b3bab72f54df26ef5baa612522e2285d218afe /src/db/sysdb.c | |
parent | 92b7275fae0e4767c01edb094f0b1d7f8a7439ac (diff) | |
download | sssd-1-8.tar.gz sssd-1-8.tar.xz sssd-1-8.zip |
sysdb: try dealing with binary-content attributessssd-1-8
https://fedorahosted.org/sssd/ticket/1818
I have here a LDAP user entry which has this attribute
loginAllowedTimeMap::
AAAAAAAAAP///38AAP///38AAP///38AAP///38AAP///38AAAAAAAAA
In the function sysdb_attrs_add_string(), called from
sdap_attrs_add_ldap_attr(), strlen() is called on this blob, which is
the wrong thing to do. The result of strlen is then used to populate
the .v_length member of a struct ldb_val - and this will set it to
zero in this case. (There is also the problem that there may not be
a '\0' at all in the blob.)
Subsequently, .v_length being 0 makes ldb_modify(), called from
sysdb_set_entry_attr(), return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX. End
result is that users do not get stored in the sysdb, and programs like
`id` or `getent ...` show incomplete information.
The bug was encountered with sssd-1.8.5. sssd-1.5.11 seemed to behave
fine, but that may not mean that is the absolute lower boundary of
introduction of the problem.
Diffstat (limited to 'src/db/sysdb.c')
-rw-r--r-- | src/db/sysdb.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/db/sysdb.c b/src/db/sysdb.c index 7b3757e74..fe508818b 100644 --- a/src/db/sysdb.c +++ b/src/db/sysdb.c @@ -508,6 +508,16 @@ int sysdb_attrs_add_string(struct sysdb_attrs *attrs, return sysdb_attrs_add_val(attrs, name, &v); } +int sysdb_attrs_add_mem(struct sysdb_attrs *attrs, const char *name, + const void *mem, size_t size) +{ + struct ldb_val v; + + v.data = discard_const(mem); + v.length = size; + return sysdb_attrs_add_val(attrs, name, &v); +} + int sysdb_attrs_add_bool(struct sysdb_attrs *attrs, const char *name, bool value) { |