The Samba-Bugzilla – Attachment 4292 Details for
Bug 6136
LDAP integer search filters don't handle signed/unsigned 32-bit rollover
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
New patch to handle integer 32bit attributes correctly
int32.patch (text/plain), 11.90 KB, created by
Matthias Dieter Wallnöfer
on 2009-06-16 04:58:19 UTC
(
hide
)
Description:
New patch to handle integer 32bit attributes correctly
Filename:
MIME Type:
Creator:
Matthias Dieter Wallnöfer
Created:
2009-06-16 04:58:19 UTC
Size:
11.90 KB
patch
obsolete
>diff --git a/source4/dsdb/samdb/ldb_modules/simple_ldap_map.c b/source4/dsdb/samdb/ldb_modules/simple_ldap_map.c >index 948241b..e9ab095 100644 >--- a/source4/dsdb/samdb/ldb_modules/simple_ldap_map.c >+++ b/source4/dsdb/samdb/ldb_modules/simple_ldap_map.c >@@ -144,23 +144,6 @@ static struct ldb_val objectCategory_always_dn(struct ldb_module *module, TALLOC > return out; > } > >-static struct ldb_val normalise_to_signed32(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val) >-{ >- long long int signed_ll = strtoll((const char *)val->data, NULL, 10); >- if (signed_ll >= 0x80000000LL) { >- union { >- int32_t signed_int; >- uint32_t unsigned_int; >- } u = { >- .unsigned_int = strtoul((const char *)val->data, NULL, 10) >- }; >- >- struct ldb_val out = data_blob_string_const(talloc_asprintf(ctx, "%d", u.signed_int)); >- return out; >- } >- return val_copy(module, ctx, val); >-} >- > static struct ldb_val usn_to_entryCSN(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val) > { > struct ldb_val out; >@@ -348,28 +331,6 @@ static const struct ldb_map_attribute entryuuid_attributes[] = > } > }, > { >- .local_name = "groupType", >- .type = MAP_CONVERT, >- .u = { >- .convert = { >- .remote_name = "groupType", >- .convert_local = normalise_to_signed32, >- .convert_remote = val_copy, >- }, >- } >- }, >- { >- .local_name = "sAMAccountType", >- .type = MAP_CONVERT, >- .u = { >- .convert = { >- .remote_name = "sAMAccountType", >- .convert_local = normalise_to_signed32, >- .convert_remote = val_copy, >- }, >- } >- }, >- { > .local_name = "usnChanged", > .type = MAP_CONVERT, > .u = { >@@ -489,28 +450,6 @@ static const struct ldb_map_attribute nsuniqueid_attributes[] = > } > }, > { >- .local_name = "groupType", >- .type = MAP_CONVERT, >- .u = { >- .convert = { >- .remote_name = "groupType", >- .convert_local = normalise_to_signed32, >- .convert_remote = val_copy, >- }, >- } >- }, >- { >- .local_name = "sAMAccountType", >- .type = MAP_CONVERT, >- .u = { >- .convert = { >- .remote_name = "sAMAccountType", >- .convert_local = normalise_to_signed32, >- .convert_remote = val_copy, >- }, >- } >- }, >- { > .local_name = "usnChanged", > .type = MAP_CONVERT, > .u = { >diff --git a/source4/dsdb/schema/schema_syntax.c b/source4/dsdb/schema/schema_syntax.c >index 4fd6501..eb1c564 100644 >--- a/source4/dsdb/schema/schema_syntax.c >+++ b/source4/dsdb/schema/schema_syntax.c >@@ -1236,7 +1236,7 @@ static const struct dsdb_syntax dsdb_syntaxes[] = { > .comment = "Boolean" > },{ > .name = "Integer", >- .ldap_oid = LDB_SYNTAX_INTEGER, >+ .ldap_oid = LDB_SYNTAX_SAMBA_INT32, > .oMSyntax = 2, > .attributeSyntax_oid = "2.5.5.9", > .drsuapi_to_ldb = dsdb_syntax_INT32_drsuapi_to_ldb, >@@ -1274,7 +1274,7 @@ static const struct dsdb_syntax dsdb_syntaxes[] = { > .ldb_syntax = LDB_SYNTAX_DIRECTORY_STRING > },{ > .name = "Enumeration", >- .ldap_oid = LDB_SYNTAX_INTEGER, >+ .ldap_oid = LDB_SYNTAX_SAMBA_INT32, > .oMSyntax = 10, > .attributeSyntax_oid = "2.5.5.9", > .drsuapi_to_ldb = dsdb_syntax_INT32_drsuapi_to_ldb, >diff --git a/source4/lib/ldb-samba/ldif_handlers.c b/source4/lib/ldb-samba/ldif_handlers.c >index d895f09..63d0d03 100644 >--- a/source4/lib/ldb-samba/ldif_handlers.c >+++ b/source4/lib/ldb-samba/ldif_handlers.c >@@ -3,6 +3,7 @@ > > Copyright (C) Andrew Tridgell 2005 > Copyright (C) Andrew Bartlett 2006-2007 >+ Copyright (C) Matthias Dieter Wallnöfer 2009 > ** NOTE! The following LGPL license applies to the ldb > ** library. This does NOT imply that all of Samba is released > ** under the LGPL >@@ -79,7 +80,7 @@ static int ldif_write_objectSid(struct ldb_context *ldb, void *mem_ctx, > return 0; > } > >-static bool ldb_comparision_objectSid_isString(const struct ldb_val *v) >+static bool ldif_comparision_objectSid_isString(const struct ldb_val *v) > { > if (v->length < 3) { > return false; >@@ -93,13 +94,13 @@ static bool ldb_comparision_objectSid_isString(const struct ldb_val *v) > /* > compare two objectSids > */ >-static int ldb_comparison_objectSid(struct ldb_context *ldb, void *mem_ctx, >+static int ldif_comparison_objectSid(struct ldb_context *ldb, void *mem_ctx, > const struct ldb_val *v1, const struct ldb_val *v2) > { >- if (ldb_comparision_objectSid_isString(v1) && ldb_comparision_objectSid_isString(v2)) { >+ if (ldif_comparision_objectSid_isString(v1) && ldif_comparision_objectSid_isString(v2)) { > return ldb_comparison_binary(ldb, mem_ctx, v1, v2); >- } else if (ldb_comparision_objectSid_isString(v1) >- && !ldb_comparision_objectSid_isString(v2)) { >+ } else if (ldif_comparision_objectSid_isString(v1) >+ && !ldif_comparision_objectSid_isString(v2)) { > struct ldb_val v; > int ret; > if (ldif_read_objectSid(ldb, mem_ctx, v1, &v) != 0) { >@@ -109,8 +110,8 @@ static int ldb_comparison_objectSid(struct ldb_context *ldb, void *mem_ctx, > ret = ldb_comparison_binary(ldb, mem_ctx, &v, v2); > talloc_free(v.data); > return ret; >- } else if (!ldb_comparision_objectSid_isString(v1) >- && ldb_comparision_objectSid_isString(v2)) { >+ } else if (!ldif_comparision_objectSid_isString(v1) >+ && ldif_comparision_objectSid_isString(v2)) { > struct ldb_val v; > int ret; > if (ldif_read_objectSid(ldb, mem_ctx, v2, &v) != 0) { >@@ -127,10 +128,10 @@ static int ldb_comparison_objectSid(struct ldb_context *ldb, void *mem_ctx, > /* > canonicalise a objectSid > */ >-static int ldb_canonicalise_objectSid(struct ldb_context *ldb, void *mem_ctx, >+static int ldif_canonicalise_objectSid(struct ldb_context *ldb, void *mem_ctx, > const struct ldb_val *in, struct ldb_val *out) > { >- if (ldb_comparision_objectSid_isString(in)) { >+ if (ldif_comparision_objectSid_isString(in)) { > if (ldif_read_objectSid(ldb, mem_ctx, in, out) != 0) { > /* Perhaps not a string after all */ > return ldb_handler_copy(ldb, mem_ctx, in, out); >@@ -145,7 +146,7 @@ static int extended_dn_read_SID(struct ldb_context *ldb, void *mem_ctx, > { > struct dom_sid sid; > enum ndr_err_code ndr_err; >- if (ldb_comparision_objectSid_isString(in)) { >+ if (ldif_comparision_objectSid_isString(in)) { > if (ldif_read_objectSid(ldb, mem_ctx, in, out) == 0) { > return 0; > } >@@ -214,7 +215,7 @@ static int ldif_write_objectGUID(struct ldb_context *ldb, void *mem_ctx, > return 0; > } > >-static bool ldb_comparision_objectGUID_isString(const struct ldb_val *v) >+static bool ldif_comparision_objectGUID_isString(const struct ldb_val *v) > { > if (v->length != 36 && v->length != 38) return false; > >@@ -257,13 +258,13 @@ static int extended_dn_read_GUID(struct ldb_context *ldb, void *mem_ctx, > /* > compare two objectGUIDs > */ >-static int ldb_comparison_objectGUID(struct ldb_context *ldb, void *mem_ctx, >+static int ldif_comparison_objectGUID(struct ldb_context *ldb, void *mem_ctx, > const struct ldb_val *v1, const struct ldb_val *v2) > { >- if (ldb_comparision_objectGUID_isString(v1) && ldb_comparision_objectGUID_isString(v2)) { >+ if (ldif_comparision_objectGUID_isString(v1) && ldif_comparision_objectGUID_isString(v2)) { > return ldb_comparison_binary(ldb, mem_ctx, v1, v2); >- } else if (ldb_comparision_objectGUID_isString(v1) >- && !ldb_comparision_objectGUID_isString(v2)) { >+ } else if (ldif_comparision_objectGUID_isString(v1) >+ && !ldif_comparision_objectGUID_isString(v2)) { > struct ldb_val v; > int ret; > if (ldif_read_objectGUID(ldb, mem_ctx, v1, &v) != 0) { >@@ -273,8 +274,8 @@ static int ldb_comparison_objectGUID(struct ldb_context *ldb, void *mem_ctx, > ret = ldb_comparison_binary(ldb, mem_ctx, &v, v2); > talloc_free(v.data); > return ret; >- } else if (!ldb_comparision_objectGUID_isString(v1) >- && ldb_comparision_objectGUID_isString(v2)) { >+ } else if (!ldif_comparision_objectGUID_isString(v1) >+ && ldif_comparision_objectGUID_isString(v2)) { > struct ldb_val v; > int ret; > if (ldif_read_objectGUID(ldb, mem_ctx, v2, &v) != 0) { >@@ -291,10 +292,10 @@ static int ldb_comparison_objectGUID(struct ldb_context *ldb, void *mem_ctx, > /* > canonicalise a objectGUID > */ >-static int ldb_canonicalise_objectGUID(struct ldb_context *ldb, void *mem_ctx, >+static int ldif_canonicalise_objectGUID(struct ldb_context *ldb, void *mem_ctx, > const struct ldb_val *in, struct ldb_val *out) > { >- if (ldb_comparision_objectGUID_isString(in)) { >+ if (ldif_comparision_objectGUID_isString(in)) { > if (ldif_read_objectGUID(ldb, mem_ctx, in, out) != 0) { > /* Perhaps it wasn't a valid string after all */ > return ldb_handler_copy(ldb, mem_ctx, in, out); >@@ -626,6 +627,31 @@ static int ldif_comparison_prefixMap(struct ldb_context *ldb, void *mem_ctx, > return ret; > } > >+/* Canonicalisation of two 32-bit integers */ >+static int ldif_canonicalise_int32(struct ldb_context *ldb, void *mem_ctx, >+ const struct ldb_val *in, struct ldb_val *out) >+{ >+ char *end; >+ int32_t i = (int32_t) strtol((char *)in->data, &end, 0); >+ if (*end != 0) { >+ return -1; >+ } >+ out->data = (uint8_t *) talloc_asprintf(mem_ctx, "%d", i); >+ if (out->data == NULL) { >+ return -1; >+ } >+ out->length = strlen((char *)out->data); >+ return 0; >+} >+ >+/* Comparison of two 32-bit integers */ >+static int ldif_comparison_int32(struct ldb_context *ldb, void *mem_ctx, >+ const struct ldb_val *v1, const struct ldb_val *v2) >+{ >+ return (int32_t) strtol((char *)v1->data, NULL, 0) >+ - (int32_t) strtol((char *)v2->data, NULL, 0); >+} >+ > static int extended_dn_write_hex(struct ldb_context *ldb, void *mem_ctx, > const struct ldb_val *in, struct ldb_val *out) > { >@@ -636,18 +662,13 @@ static int extended_dn_write_hex(struct ldb_context *ldb, void *mem_ctx, > return 0; > } > >- >-#define LDB_SYNTAX_SAMBA_GUID "LDB_SYNTAX_SAMBA_GUID" >-#define LDB_SYNTAX_SAMBA_OBJECT_CATEGORY "LDB_SYNTAX_SAMBA_OBJECT_CATEGORY" >-#define LDB_SYNTAX_SAMBA_PREFIX_MAP "LDB_SYNTAX_SAMBA_PREFIX_MAP" >- > static const struct ldb_schema_syntax samba_syntaxes[] = { > { > .name = LDB_SYNTAX_SAMBA_SID, > .ldif_read_fn = ldif_read_objectSid, > .ldif_write_fn = ldif_write_objectSid, >- .canonicalise_fn = ldb_canonicalise_objectSid, >- .comparison_fn = ldb_comparison_objectSid >+ .canonicalise_fn = ldif_canonicalise_objectSid, >+ .comparison_fn = ldif_comparison_objectSid > },{ > .name = LDB_SYNTAX_SAMBA_SECURITY_DESCRIPTOR, > .ldif_read_fn = ldif_read_ntSecurityDescriptor, >@@ -658,8 +679,8 @@ static const struct ldb_schema_syntax samba_syntaxes[] = { > .name = LDB_SYNTAX_SAMBA_GUID, > .ldif_read_fn = ldif_read_objectGUID, > .ldif_write_fn = ldif_write_objectGUID, >- .canonicalise_fn = ldb_canonicalise_objectGUID, >- .comparison_fn = ldb_comparison_objectGUID >+ .canonicalise_fn = ldif_canonicalise_objectGUID, >+ .comparison_fn = ldif_comparison_objectGUID > },{ > .name = LDB_SYNTAX_SAMBA_OBJECT_CATEGORY, > .ldif_read_fn = ldb_handler_copy, >@@ -672,6 +693,12 @@ static const struct ldb_schema_syntax samba_syntaxes[] = { > .ldif_write_fn = ldif_write_prefixMap, > .canonicalise_fn = ldif_canonicalise_prefixMap, > .comparison_fn = ldif_comparison_prefixMap >+ },{ >+ .name = LDB_SYNTAX_SAMBA_INT32, >+ .ldif_read_fn = ldb_handler_copy, >+ .ldif_write_fn = ldb_handler_copy, >+ .canonicalise_fn = ldif_canonicalise_int32, >+ .comparison_fn = ldif_comparison_int32 > } > }; > >@@ -694,6 +721,7 @@ static const struct ldb_dn_extended_syntax samba_dn_syntax[] = { > } > }; > >+/* TODO: Should be dynamic at some point */ > static const struct { > const char *name; > const char *syntax; >diff --git a/source4/lib/ldb-samba/ldif_handlers.h b/source4/lib/ldb-samba/ldif_handlers.h >index e37c416..3e1f17e 100644 >--- a/source4/lib/ldb-samba/ldif_handlers.h >+++ b/source4/lib/ldb-samba/ldif_handlers.h >@@ -3,6 +3,10 @@ > > #define LDB_SYNTAX_SAMBA_SID "LDB_SYNTAX_SAMBA_SID" > #define LDB_SYNTAX_SAMBA_SECURITY_DESCRIPTOR "1.2.840.113556.1.4.907" >+#define LDB_SYNTAX_SAMBA_GUID "LDB_SYNTAX_SAMBA_GUID" >+#define LDB_SYNTAX_SAMBA_OBJECT_CATEGORY "LDB_SYNTAX_SAMBA_OBJECT_CATEGORY" >+#define LDB_SYNTAX_SAMBA_PREFIX_MAP "LDB_SYNTAX_SAMBA_PREFIX_MAP" >+#define LDB_SYNTAX_SAMBA_INT32 "LDB_SYNTAX_SAMBA_INT32" > > #include "lib/ldb-samba/ldif_handlers_proto.h" >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 6136
:
3951
|
3952
|
4282
|
4290
|
4292
|
4300