s4:ldb_msg: first try to decode integers as signed and then fallback to unsigned
authorStefan Metzmacher <metze@samba.org>
Mon, 11 Jan 2010 19:18:09 +0000 (20:18 +0100)
committerStefan Metzmacher <metze@samba.org>
Wed, 13 Jan 2010 13:52:00 +0000 (14:52 +0100)
LDAP only knowns about signed integers, so let
ldb_msg_find_attr_as_uint() and ldb_msg_find_attr_as_uint64() cope
with it.

metze

source4/lib/ldb/common/ldb_msg.c

index cb8d4a8d9ae6c991099053b2811e729ae59b38d4..9f90f3340562d8676c77a4403b09bb60a5a0a5b9 100644 (file)
@@ -353,10 +353,19 @@ unsigned int ldb_msg_find_attr_as_uint(const struct ldb_message *msg,
                                       const char *attr_name,
                                       unsigned int default_value)
 {
+       unsigned int ret;
        const struct ldb_val *v = ldb_msg_find_ldb_val(msg, attr_name);
        if (!v || !v->data) {
                return default_value;
        }
+
+       /* in LDAP there're only int32_t values */
+       errno = 0;
+       ret = strtol((const char *)v->data, NULL, 0);
+       if (errno == 0) {
+               return ret;
+       }
+
        return strtoul((const char *)v->data, NULL, 0);
 }
 
@@ -375,10 +384,19 @@ uint64_t ldb_msg_find_attr_as_uint64(const struct ldb_message *msg,
                                     const char *attr_name,
                                     uint64_t default_value)
 {
+       uint64_t ret;
        const struct ldb_val *v = ldb_msg_find_ldb_val(msg, attr_name);
        if (!v || !v->data) {
                return default_value;
        }
+
+       /* in LDAP there're only int64_t values */
+       errno = 0;
+       ret = strtoll((const char *)v->data, NULL, 0);
+       if (errno == 0) {
+               return ret;
+       }
+
        return strtoull((const char *)v->data, NULL, 0);
 }