The branch, master has been updated via 0c931fb301c waf: Run python tests also with tr_TR locale via 24275cd800b lib:ldb: Use ldb_ascii_toupper() for case folding via a8f6fa03ef6 lib:ldb: Add ldb_ascii_toupper() via 78ca66a1a54 lib:ldb: Remove trailing white spaces in ldb_private.h via c8e3873e7e6 lib:ldb: Fix trailing whitespaces in common/ldb_utf8.c via 14751e91a52 lib:ldb: Fix trailing whitespaces in common/attrib_handlers.c from c515a5b2cc3 smbd: Make send_trans2_replies() static
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 0c931fb301c5137668db671a6d861c5b5769aa18 Author: Andreas Schneider <a...@samba.org> Date: Fri Nov 18 08:49:29 2022 +0100 waf: Run python tests also with tr_TR locale BUG: https://bugzilla.samba.org/show_bug.cgi?id=15248 Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> Autobuild-User(master): Andreas Schneider <a...@cryptomilk.org> Autobuild-Date(master): Fri Dec 23 14:17:31 UTC 2022 on sn-devel-184 commit 24275cd800b05538ae32e29cbe74529076184954 Author: Andreas Schneider <a...@samba.org> Date: Thu Nov 10 14:44:59 2022 +0100 lib:ldb: Use ldb_ascii_toupper() for case folding For example there are at least two locales (tr_TR and az_AZ) in glibc having dotless i transformation different from Latin scripts and GUID versus Guid comparison would be different there (attribute name would not match in the test). See also https://en.wikipedia.org/wiki/Dotted_and_dotless_I https://lists.samba.org/archive/samba-technical/2019-December/134659.html This fixes: LC_ALL=tr_TR.UTF-8 make test BUG: https://bugzilla.samba.org/show_bug.cgi?id=15248 Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit a8f6fa03ef68f086e46539af4d4594b35e638e37 Author: Andreas Schneider <a...@samba.org> Date: Wed Mar 23 12:45:37 2022 +0100 lib:ldb: Add ldb_ascii_toupper() BUG: https://bugzilla.samba.org/show_bug.cgi?id=15248 Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit 78ca66a1a54ede649ca9726e81b420993234b1cf Author: Andreas Schneider <a...@samba.org> Date: Thu Nov 10 14:46:47 2022 +0100 lib:ldb: Remove trailing white spaces in ldb_private.h BUG: https://bugzilla.samba.org/show_bug.cgi?id=15248 Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit c8e3873e7e6677720c74882bcc63e72fb03e98cc Author: Andreas Schneider <a...@samba.org> Date: Wed Mar 23 12:44:07 2022 +0100 lib:ldb: Fix trailing whitespaces in common/ldb_utf8.c BUG: https://bugzilla.samba.org/show_bug.cgi?id=15248 Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit 14751e91a5218c168f50e0bd998593f425f7f4c0 Author: Andreas Schneider <a...@samba.org> Date: Wed Mar 23 12:43:36 2022 +0100 lib:ldb: Fix trailing whitespaces in common/attrib_handlers.c BUG: https://bugzilla.samba.org/show_bug.cgi?id=15248 Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/ldb/common/attrib_handlers.c | 49 ++++++++++++++++++++++------------------ lib/ldb/common/ldb_utf8.c | 12 ++++++---- lib/ldb/include/ldb.h | 18 ++++++++++----- lib/ldb/include/ldb_private.h | 23 +++++++++++++++---- lib/ldb/wscript | 7 ++++++ 5 files changed, 72 insertions(+), 37 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/ldb/common/attrib_handlers.c b/lib/ldb/common/attrib_handlers.c index febf2f414ca..2c30f5235a9 100644 --- a/lib/ldb/common/attrib_handlers.c +++ b/lib/ldb/common/attrib_handlers.c @@ -1,4 +1,4 @@ -/* +/* ldb database library Copyright (C) Andrew Tridgell 2005 @@ -7,7 +7,7 @@ ** NOTE! The following LGPL license applies to the ldb ** library. This does NOT imply that all of Samba is released ** under the LGPL - + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either @@ -309,7 +309,7 @@ int ldb_comparison_binary(struct ldb_context *ldb, void *mem_ctx, compare two case insensitive strings, ignoring multiple whitespaces and leading and trailing whitespaces see rfc2252 section 8.1 - + try to optimize for the ascii case, but if we find out an utf8 codepoint revert to slower but correct function */ @@ -321,6 +321,7 @@ int ldb_comparison_fold(struct ldb_context *ldb, void *mem_ctx, char *b1, *b2; const char *u1, *u2; int ret; + while (n1 && *s1 == ' ') { s1++; n1--; }; while (n2 && *s2 == ' ') { s2++; n2--; }; @@ -345,24 +346,28 @@ int ldb_comparison_fold(struct ldb_context *ldb, void *mem_ctx, * "domainUpdates" */ if (n1 && *s1 == ' ' && (!n2 || !*s2)) { - while (n1 && *s1 == ' ') { s1++; n1--; } + while (n1 && *s1 == ' ') { s1++; n1--; } } if (n2 && *s2 == ' ' && (!n1 || !*s1)) { - while (n2 && *s2 == ' ') { s2++; n2--; } + while (n2 && *s2 == ' ') { s2++; n2--; } } if (n1 == 0 && n2 != 0) { - return -(int)toupper(*s2); + return -(int)ldb_ascii_toupper(*s2); } if (n2 == 0 && n1 != 0) { - return (int)toupper(*s1); + return (int)ldb_ascii_toupper(*s1); } if (n1 == 0 && n2 == 0) { return 0; } - return (int)toupper(*s1) - (int)toupper(*s2); + return (int)ldb_ascii_toupper(*s1) - (int)ldb_ascii_toupper(*s2); utf8str: - /* no need to recheck from the start, just from the first utf8 char found */ + /* + * No need to recheck from the start, just from the first utf8 charu + * found. Note that the callback of ldb_casefold() needs to be ascii + * compatible. + */ b1 = ldb_casefold(ldb, mem_ctx, s1, n1); b2 = ldb_casefold(ldb, mem_ctx, s2, n2); @@ -375,9 +380,9 @@ utf8str: if (ret == 0) { if (n1 == n2) return 0; if (n1 > n2) { - return (int)toupper(s1[n2]); + return (int)ldb_ascii_toupper(s1[n2]); } else { - return -(int)toupper(s2[n1]); + return -(int)ldb_ascii_toupper(s2[n1]); } } return ret; @@ -403,7 +408,7 @@ utf8str: talloc_free(b1); talloc_free(b2); - + return ret; } @@ -455,7 +460,7 @@ static int ldb_comparison_dn(struct ldb_context *ldb, void *mem_ctx, if ( ! ldb_dn_validate(dn2)) { talloc_free(dn1); return -1; - } + } ret = ldb_dn_compare(dn1, dn2); @@ -523,7 +528,7 @@ static int ldb_canonicalise_generalizedtime(struct ldb_context *ldb, void *mem_c table of standard attribute handlers */ static const struct ldb_schema_syntax ldb_standard_syntaxes[] = { - { + { .name = LDB_SYNTAX_INTEGER, .ldif_read_fn = ldb_handler_copy, .ldif_write_fn = ldb_handler_copy, @@ -545,35 +550,35 @@ static const struct ldb_schema_syntax ldb_standard_syntaxes[] = { .canonicalise_fn = ldb_handler_copy, .comparison_fn = ldb_comparison_binary }, - { + { .name = LDB_SYNTAX_DIRECTORY_STRING, .ldif_read_fn = ldb_handler_copy, .ldif_write_fn = ldb_handler_copy, .canonicalise_fn = ldb_handler_fold, .comparison_fn = ldb_comparison_fold }, - { + { .name = LDB_SYNTAX_DN, .ldif_read_fn = ldb_handler_copy, .ldif_write_fn = ldb_handler_copy, .canonicalise_fn = ldb_canonicalise_dn, .comparison_fn = ldb_comparison_dn }, - { + { .name = LDB_SYNTAX_OBJECTCLASS, .ldif_read_fn = ldb_handler_copy, .ldif_write_fn = ldb_handler_copy, .canonicalise_fn = ldb_handler_fold, .comparison_fn = ldb_comparison_fold }, - { + { .name = LDB_SYNTAX_UTC_TIME, .ldif_read_fn = ldb_handler_copy, .ldif_write_fn = ldb_handler_copy, .canonicalise_fn = ldb_canonicalise_utctime, .comparison_fn = ldb_comparison_utctime }, - { + { .name = LDB_SYNTAX_GENERALIZED_TIME, .ldif_read_fn = ldb_handler_copy, .ldif_write_fn = ldb_handler_copy, @@ -607,8 +612,8 @@ const struct ldb_schema_syntax *ldb_standard_syntax_by_name(struct ldb_context * return NULL; } -int ldb_any_comparison(struct ldb_context *ldb, void *mem_ctx, - ldb_attr_handler_t canonicalise_fn, +int ldb_any_comparison(struct ldb_context *ldb, void *mem_ctx, + ldb_attr_handler_t canonicalise_fn, const struct ldb_val *v1, const struct ldb_val *v2) { @@ -619,7 +624,7 @@ int ldb_any_comparison(struct ldb_context *ldb, void *mem_ctx, /* I could try and bail if tmp_ctx was NULL, but what return * value would I use? * - * It seems easier to continue on the NULL context + * It seems easier to continue on the NULL context */ ret1 = canonicalise_fn(ldb, tmp_ctx, v1, &v1_canon); ret2 = canonicalise_fn(ldb, tmp_ctx, v2, &v2_canon); diff --git a/lib/ldb/common/ldb_utf8.c b/lib/ldb/common/ldb_utf8.c index 55d8f905d35..f45b72dde50 100644 --- a/lib/ldb/common/ldb_utf8.c +++ b/lib/ldb/common/ldb_utf8.c @@ -1,4 +1,4 @@ -/* +/* ldb database library Copyright (C) Andrew Tridgell 2004 @@ -6,7 +6,7 @@ ** NOTE! The following LGPL license applies to the ldb ** library. This does NOT imply that all of Samba is released ** under the LGPL - + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either @@ -62,7 +62,7 @@ char *ldb_casefold_default(void *context, TALLOC_CTX *mem_ctx, const char *s, si return NULL; } for (i=0;ret[i];i++) { - ret[i] = toupper((unsigned char)ret[i]); + ret[i] = ldb_ascii_toupper((unsigned char)ret[i]); } return ret; } @@ -118,7 +118,7 @@ char *ldb_attr_casefold(TALLOC_CTX *mem_ctx, const char *s) return NULL; } for (i = 0; ret[i]; i++) { - ret[i] = toupper((unsigned char)ret[i]); + ret[i] = ldb_ascii_toupper((unsigned char)ret[i]); } return ret; } @@ -134,3 +134,7 @@ int ldb_attr_dn(const char *attr) } return -1; } + +_PRIVATE_ char ldb_ascii_toupper(char c) { + return ('a' <= c && c <= 'z') ? c ^ 0x20 : toupper(c); +} diff --git a/lib/ldb/include/ldb.h b/lib/ldb/include/ldb.h index 68cbfdb6f7a..b3bdbb30f31 100644 --- a/lib/ldb/include/ldb.h +++ b/lib/ldb/include/ldb.h @@ -1551,7 +1551,11 @@ const char *ldb_strerror(int ldb_err); void ldb_set_utf8_default(struct ldb_context *ldb); /** - Casefold a string + \brief Casefold a string + + Note that the callback needs to be ASCII compatible. So first ASCII needs + to be handle before any UTF-8. This is needed to avoid issues with dottet + languages. \param ldb the ldb context \param mem_ctx the memory context to allocate the result string @@ -1745,7 +1749,7 @@ char * ldb_ldif_write_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, \return the string containing the LDIF, or NULL on error - \sa ldb_ldif_message_redacted_string for a safer version of this + \sa ldb_ldif_message_redacted_string for a safer version of this function */ char *ldb_ldif_message_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, @@ -1763,7 +1767,7 @@ char *ldb_ldif_message_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, \return the string containing the LDIF, or NULL on error, but with secret attributes redacted - \note The secret attributes are specified in a + \note The secret attributes are specified in a 'const char * const *' within the LDB_SECRET_ATTRIBUTE_LIST opaque set on the ldb @@ -1949,7 +1953,7 @@ struct ldb_message *ldb_msg_new(TALLOC_CTX *mem_ctx); /** Find an element within an message */ -struct ldb_message_element *ldb_msg_find_element(const struct ldb_message *msg, +struct ldb_message_element *ldb_msg_find_element(const struct ldb_message *msg, const char *attr_name); /** @@ -1970,7 +1974,7 @@ int ldb_val_equal_exact(const struct ldb_val *v1, const struct ldb_val *v2); \note This search is case sensitive */ -struct ldb_val *ldb_msg_find_val(const struct ldb_message_element *el, +struct ldb_val *ldb_msg_find_val(const struct ldb_message_element *el, struct ldb_val *val); /** @@ -2186,7 +2190,9 @@ int ldb_set_debug(struct ldb_context *ldb, void *context); /** - this allows the user to set custom utf8 function for error reporting + this allows the user to set custom utf8 function for error reporting. make + sure it is able to handle ASCII first, so it prevents issues with dottet + languages. */ void ldb_set_utf8_fns(struct ldb_context *ldb, void *context, diff --git a/lib/ldb/include/ldb_private.h b/lib/ldb/include/ldb_private.h index 4deb24691ca..7d9a47c8ef3 100644 --- a/lib/ldb/include/ldb_private.h +++ b/lib/ldb/include/ldb_private.h @@ -1,4 +1,4 @@ -/* +/* ldb database library Copyright (C) Andrew Tridgell 2004 @@ -8,7 +8,7 @@ ** NOTE! The following LGPL license applies to the ldb ** library. This does NOT imply that all of Samba is released ** under the LGPL - + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either @@ -84,7 +84,7 @@ struct ldb_module { struct ldb_schema { void *attribute_handler_override_private; ldb_attribute_handler_override_fn_t attribute_handler_override; - + /* attribute handling table */ unsigned num_attributes; struct ldb_schema_attribute *attributes; @@ -233,10 +233,10 @@ struct ldif_read_file_state { size_t line_no; }; -struct ldb_ldif *ldb_ldif_read_file_state(struct ldb_context *ldb, +struct ldb_ldif *ldb_ldif_read_file_state(struct ldb_context *ldb, struct ldif_read_file_state *state); -char *ldb_ldif_write_redacted_trace_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, +char *ldb_ldif_write_redacted_trace_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, const struct ldb_ldif *ldif); /* @@ -317,4 +317,17 @@ int ldb_match_message(struct ldb_context *ldb, const struct ldb_parse_tree *tree, enum ldb_scope scope, bool *matched); +/** + * @brief Convert a character to uppercase with ASCII precedence. + * + * This will convert a character to uppercase. If the character is an ASCII + * character it will convert it to uppercase ASCII first and then fallback to + * localized toupper() from libc. + * + * @param c The character to convert. + * + * @return The converted character or c if the conversion was not possible. + */ +char ldb_ascii_toupper(char c); + #endif diff --git a/lib/ldb/wscript b/lib/ldb/wscript index 97a1dcd2e58..2dfac46403f 100644 --- a/lib/ldb/wscript +++ b/lib/ldb/wscript @@ -619,6 +619,13 @@ def test(ctx): 'tests/python/index.py', 'tests/python/repack.py'], extra_env={'SELFTEST_PREFIX': test_prefix}) + pyret = samba_utils.RUN_PYTHON_TESTS( + ['tests/python/api.py', + 'tests/python/crash.py', + 'tests/python/index.py', + 'tests/python/repack.py'], + extra_env={'SELFTEST_PREFIX': test_prefix, + 'LC_ALL': 'tr_TR.UTF-8'}) print("Python testsuite returned %d" % pyret) cmocka_ret = 0 -- Samba Shared Repository