s4: Make the int32 problem more clear - and fix another error
authorMatthias Dieter Wallnöfer <mwallnoefer@yahoo.de>
Mon, 17 Aug 2009 18:29:11 +0000 (20:29 +0200)
committerMatthias Dieter Wallnöfer <mwallnoefer@yahoo.de>
Mon, 17 Aug 2009 18:29:11 +0000 (20:29 +0200)
source4/dsdb/samdb/ldb_modules/simple_ldap_map.c
source4/dsdb/schema/schema_syntax.c
source4/lib/ldb-samba/ldif_handlers.c

index 8fb639f53f10996be30407a8d1c7ad99c0cf4183..21b80dccbf3b9d4d60cd0b2c9351cce102788a94 100644 (file)
@@ -147,6 +147,8 @@ static struct ldb_val objectCategory_always_dn(struct ldb_module *module, TALLOC
 static struct ldb_val normalise_to_signed32(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
 {
        struct ldb_val out;
+       /* We've to use "strtoll" here to have the intended overflows.
+        * Otherwise we may get "LONG_MAX" and the conversion is wrong. */
        int32_t i = (int32_t) strtoll((char *)val->data, NULL, 0);
        out = data_blob_string_const(talloc_asprintf(ctx, "%d", i));
        return out;
index c26b407c1f2e3a98f886d4f4dd267e425f756ec7..6159ab48b1a1cbb6e27c8d64ebdbd9b899723327 100644 (file)
@@ -234,7 +234,9 @@ static WERROR dsdb_syntax_INT32_ldb_to_drsuapi(struct ldb_context *ldb,
                blobs[i] = data_blob_talloc(blobs, NULL, 4);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
-               v = strtol((const char *)in->values[i].data, NULL, 10);
+               /* We've to use "strtoll" here to have the intended overflows.
+                * Otherwise we may get "LONG_MAX" and the conversion is wrong. */
+               v = strtoll((const char *)in->values[i].data, NULL, 0);
 
                SIVALS(blobs[i].data, 0, v);
        }
index acf8af7917b420ece2ec017db3896cfb26659aa0..708643011bfd81db1a95c3c1122d100775e364b7 100644 (file)
@@ -649,6 +649,8 @@ static int ldif_canonicalise_int32(struct ldb_context *ldb, void *mem_ctx,
                        const struct ldb_val *in, struct ldb_val *out)
 {
        char *end;
+       /* We've to use "strtoll" here to have the intended overflows.
+        * Otherwise we may get "LONG_MAX" and the conversion is wrong. */
        int32_t i = (int32_t) strtoll((char *)in->data, &end, 0);
        if (*end != 0) {
                return -1;
@@ -665,6 +667,8 @@ static int ldif_canonicalise_int32(struct ldb_context *ldb, void *mem_ctx,
 static int ldif_comparison_int32(struct ldb_context *ldb, void *mem_ctx,
                        const struct ldb_val *v1, const struct ldb_val *v2)
 {
+       /* We've to use "strtoll" here to have the intended overflows.
+        * Otherwise we may get "LONG_MAX" and the conversion is wrong. */
        return (int32_t) strtoll((char *)v1->data, NULL, 0)
         - (int32_t) strtoll((char *)v2->data, NULL, 0);
 }