[SCM] Samba Shared Repository - branch v4-19-stable updated
Jule Anger
janger at samba.org
Mon Jun 10 15:31:13 UTC 2024
The branch, v4-19-stable has been updated
via bce5c475d12 VERSION: Disable GIT_SNAPSHOT for the 4.19.7 release.
via e71f7441c9e WHATSNEW: Add release notes for Samba 4.19.7.
via 6ca4df63741 BUG 15569 ldb: Release LDB 2.8.1
via d4f9272b7e9 s3:smbcacls: fix ace_compare
via 123f458dda6 ldb:attrib_handlers: reduce non-transitive behaviour in ldb_comparison_fold
via 00000382d17 ldb:attrib_handlers: use NUMERIC_CMP in ldb_comparison_fold
via ae8eb3d2b09 s4:dsdb:mod: repl_md: message sort uses NUMERIC_CMP()
via 2a53574e07e s4:dsdb:mod: repl_md: make message_sort transitive
via 92daa0a7801 ldb: avoid NULL deref in ldb_db_compare
via ca905ccbf1e ldb:attrib_handlers: make ldb_comparison_Boolean more consistent
via 50bfb065e01 ldb-samba:ldif_handlers: dn_link_comparison: sort invalid DNs
via 5c5c652db7c ldb-samba:ldif_handlers: dn_link_comparison leaks less
via 96f3db39522 ldb-samba:ldif_handlers: dn_link_comparison correctly sorts deleted objects
via 2b3416384ae ldb-samba:ldif_handlers: dn_link_comparison semi-sorts invalid DNs
via fae4e0b16aa ldb-samba:ldif_handlers: dn_link_comparison semi-sorts deleted objects
via 108f687cf22 ldb-samba: ldif-handlers: make ldif_comparison_objectSid() accurate
via 5bf176b5692 s4:rpcsrv:samr: improve a comment in compare_msgRid
via 24d362e62d4 s4:rpcsrv:dnsserver: make dns_name_compare transitive with NULLs
via 9314eaaba91 s3:libsmb:nmblib: use NUMERIC_CMP in status_compare
via f0f9598d5d1 lib/socket: rearrange iface_comp() to use NUMERIC_CMP
via c1819217c0a gensec: sort_gensec uses NUMERIC_CMP
via 4066451f6e8 s3:rpc:wkssvc_nt: dom_user_cmp uses NUMERIC_CMP
via 16288b40eb9 dsdb:schema: use NUMERIC_CMP in place of uint32_cmp
via 069e651d4b8 s3:mod:vfs_vxfs: use NUMERIC_CMP in vxfs_ace_cmp
via f58d857d722 s3:mod:posixacl_xattr: use NUMERIC_CMP in posixacl_xattr_entry_compare
via 13645e1131b s3:brlock: use NUMERIC_CMP in #ifdef-zeroed lock_compare
via aa255148bbb ldb:dn: make ldb_dn_compare() self-consistent
via 867dce05d21 ldb:sort: generalise both-NULL check to equality check
via 87a6fe0058a ldb:sort: check that elements have values
via 71d2c9093cf ldb:mod:sort: rearrange NULL checks
via d4477eab44a s3:libsmb_xattr: ace_compare() uses NUMERIC_CMP()
via 075aae1d1a0 s3:util:sharesec ace_compare() uses NUMERIC_CMP()
via 32f4e0c7f5a s3:smbcacls: use NUMERIC_CMP in ace_compare
via 26e08f8fc7d s3:util:net_registry: registry_value_cmp() uses NUMERIC_CMP()
via 30f0a2fb131 s4:wins: use NUMERIC_CMP in nbtd_wins_randomize1Clist_sort()
via 91dd5024010 s4:wins: winsdb_addr_sort_list() uses NUMERIC_CMP()
via 0f8e25b897f s4:wins: use NUMERIC_CMP in winsdb_addr_sort_list()
via f14a1370f48 s4:dns_server: use NUMERIC_CMP in rec_cmp()
via 622bf82fb32 s4:rpc_server: compare_SamEntry() uses NUMERIC_CMP()
via 6b07ce82a58 s3:lib:util_tdb: use NUMERIC_CMP() in tdb_data_cmp()
via b7f581fb61f libcli/security: use NUMERIC_CMP in dom_sid_compare_auth()
via 60c318fc66b libcli/security: use NUMERIC_CMP in dom_sid_compare()
via 23d792875f9 ldb: reduce non-transitive comparisons in ldb_msg_element_compare()
via b2dbe57c977 ldb: avoid non-transitive comparison in ldb_val_cmp()
via fe804401b9b util:datablob: avoid non-transitive comparison in data_blob_cmp()
via ad50158af05 ldb:attrib_handlers: ldb_comparison_binary uses NUMERIC_CMP()
via 9de4a5d3bbc ldb:attrib_handlers: ldb_comparison_Boolean uses NUMERIC_CMP()
via c85cb252af0 util: charset:util_str: use NUMERIC_CMP in strncasecmp_m_handle
via 5847e53de2f lib/torture: add assert_int_{less,greater} macros
via 12c6c305fb1 s3:libsmb:namequery: use NUMERIC_CMP in addr_compare
via 74befdb1387 s3:libsmb:namequery: note intransitivity in addr_compare()
via 2557ab23014 util:charset:codepoints: codepoint_cmpi warning about non-transitivity
via 120479e4e02 util:charset:codepoints: condepoint_cmpi uses NUMERIC_CMP()
via 388b11b6dc1 util:test: test_ms_fn_match_protocol_no_wildcard: allow -1
via 59f6652aeee util:charset:util_str: use NUMERIC_CMP in strcasecmp_m_handle
via 3f8063530d2 torture:charset: test more of strcasecmp_m
via 6b08f2ed860 torture:charset: use < and > assertions for strncasecmp_m
via 5082378df18 torture:charset: use < and > assertions for strcasecmp_m
via 1a45f172070 util:binsearch: user NUMERIC_CMP()
via ea27699bcd2 s4: use numeric_cmp in dns_common_sort_zones()
via 792f8d40e1c s4:dsdb:mod:operational: use NUMERIC_CMP in pso_compare
via 25e97cd7dba s4:ntvfs: use NUMERIC_CMP in stream_name_cmp
via 6c9119371cd ldb:ldb_dn: use safe NUMERIC_CMP in ldb_dn_compare()
via 8a706fa32be ldb:ldb_dn: use safe NUMERIC_CMP in ldb_dn_compare_base()
via 20a8eaa8b86 ldb: add NUMERIC_CMP macro to ldb.h
via d386c57d68b util:tsort.h: add a macro for safely comparing numbers
via 22d8332e1b9 lib/fuzzing/decode_ndr_X_crash: guess the pipe from filename
via 241ebc607b2 ldb: avoid out of bounds read and write in ldb_qsort()
via fab04efa325 s3:libads: avoid changing ADS->server.workgroup
via b6253028b30 s3:libsmb: allow store_cldap_reply() to work with a ipv6 response
via 3b922dd5759 s4:dsdb/repl: let drepl_out_helpers.c always go via dreplsrv_out_drsuapi_send()
via 92a0533a9ea s3:utils: let smbstatus report anonymous signing/encryption explicitly
via 45b9b63283d s3:smbd: allow anonymous encryption after one authenticated session setup
via 1925abda4c4 s3:utils: let smbstatus also report partial tcon signing/encryption
via 70969d8da5a s3:utils: let smbstatus also report AES-256 encryption types for tcons
via 8cc6ccb54a3 s3:utils: let connections_forall_read() report if the session was authenticated
via 8b6b837eb7d s3:lib: let sessionid_traverse_read() report if the session was authenticated
via c9c83fb691f s3:utils: remove unused signing_flags in connections_forall()
via a6c549db3d8 s4:torture/smb2: add smb2.session.anon-{encryption{1,2,},signing{1,2}}
via 3f476fd8bf3 s4:libcli/smb2: add hack to test anonymous signing and encryption
via 7a75e6bdaf0 smbXcli_base: add hacks to test anonymous signing and encryption
via 98adde991bf tests/ntacls: unblock failing gitlab pipelines because test_setntacl_forcenative
via 11edf47d3c3 .gitlab-ci-main.yml: debug kernel details of the current runner
via 5502aa893cc .gitlab-ci: Remove tags no longer provided by gitlab.com
via b00c09bee3b s3:utils: Fix Inherit-Only flag being automatically propagated to children
via e703c0c3914 python/samba/tests/blackbox: Add tests for Inherit-only flag propagation
via 2930a1955bf libcli/http: Detect unsupported Transfer-encoding type
via 65bb329e166 selftest: Add new test for testing non-chunk transfer encoding
via a269412c71e selftest: fix potential reference before assigned error
via cbd4a6633c6 libcli/http: Handle http chunked transfer encoding
via 57757be4dfd tests: add test for chunked encoding with http cli library
via a05d96e4b96 libcli/http: Optimise reading for content-length
via c27ad381b39 selftest: Add basic content-lenght http tests
via 6636ec3bb2a Add simple http_client for use in black box tests (in following commits)
via 4b7785226ad VERSION: Bump version up to Samba 4.19.7...
from b400092dd0a VERSION: Disable GIT_SNAPSHOT for the 4.19.6 release.
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-19-stable
- Log -----------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
.gitlab-ci-coverage-runners.yml | 8 +-
.gitlab-ci-default-runners.yml | 46 +-
.gitlab-ci-main.yml | 6 +
VERSION | 2 +-
WHATSNEW.txt | 66 ++-
auth/gensec/gensec_start.c | 2 +-
lib/fuzzing/decode_ndr_X_crash | 12 +-
lib/ldb-samba/ldif_handlers.c | 94 +--
lib/ldb/ABI/{ldb-2.8.0.sigs => ldb-2.8.1.sigs} | 0
lib/ldb/common/attrib_handlers.c | 53 +-
lib/ldb/common/ldb_dn.c | 30 +-
lib/ldb/common/ldb_msg.c | 13 +-
lib/ldb/common/qsort.c | 2 +-
lib/ldb/include/ldb.h | 16 +
lib/ldb/modules/sort.c | 19 +-
lib/ldb/wscript | 2 +-
lib/socket/interfaces.c | 22 +-
lib/torture/torture.h | 20 +
lib/util/charset/codepoints.c | 15 +-
lib/util/charset/tests/charset.c | 31 +-
lib/util/charset/util_str.c | 9 +-
lib/util/data_blob.c | 5 +-
lib/util/tests/binsearch.c | 6 +-
lib/util/tests/test_ms_fnmatch.c | 2 +-
lib/util/tsort.h | 19 +
libcli/http/http.c | 309 +++++++++-
libcli/http/http_internal.h | 4 +
libcli/security/dom_sid.c | 25 +-
libcli/smb/smbXcli_base.c | 104 +++-
libcli/smb/smbXcli_base.h | 5 +
python/samba/tests/blackbox/http_chunk.py | 129 +++++
python/samba/tests/blackbox/http_content.py | 95 ++++
.../blackbox/smbcacls_propagate_inhertance.py | 108 ++++
python/samba/tests/ntacls.py | 2 +-
selftest/flapping.d/gitlab-setxattr-security | 18 +
selftest/knownfail-32bit | 8 -
selftest/knownfail.d/smbcacls | 0
selftest/tests.py | 2 +
source3/include/session.h | 1 +
source3/lib/sessionid_tdb.c | 8 +
source3/lib/util_tdb.c | 4 +-
source3/libads/ldap.c | 16 +-
source3/librpc/idl/ads.idl | 1 +
source3/libsmb/dsgetdcname.c | 24 +-
source3/libsmb/libsmb_xattr.c | 14 +-
source3/libsmb/namequery.c | 14 +-
source3/libsmb/nmblib.c | 6 +-
source3/locking/brlock.c | 7 +-
source3/modules/posixacl_xattr.c | 6 +-
source3/modules/vfs_vxfs.c | 6 +-
source3/rpc_server/wkssvc/srv_wkssvc_nt.c | 2 +-
source3/smbd/globals.h | 5 +
source3/smbd/smb2_server.c | 11 +
source3/smbd/smb2_sesssetup.c | 18 +-
source3/smbd/smb2_tcon.c | 4 +
source3/utils/conn_tdb.c | 12 +-
source3/utils/conn_tdb.h | 1 +
source3/utils/net_ads.c | 6 +
source3/utils/net_registry.c | 2 +-
source3/utils/sharesec.c | 8 +-
source3/utils/smbcacls.c | 19 +-
source3/utils/status.c | 82 ++-
source3/utils/status.h | 1 +
source3/utils/status_json.c | 2 +
source4/client/http_test.c | 401 +++++++++++++
source4/dns_server/dnsserver_common.c | 6 +-
source4/dsdb/repl/drepl_out_helpers.c | 26 +-
source4/dsdb/samdb/ldb_modules/operational.c | 2 +-
source4/dsdb/samdb/ldb_modules/repl_meta_data.c | 17 +-
source4/dsdb/schema/schema_set.c | 14 +-
source4/libcli/smb2/session.c | 16 +-
source4/libcli/smb2/smb2.h | 2 +
source4/nbt_server/wins/winsdb.c | 5 +-
source4/nbt_server/wins/winsserver.c | 3 +-
source4/ntvfs/posix/pvfs_streams.c | 3 +-
source4/rpc_server/dnsserver/dnsdata.c | 16 +-
source4/rpc_server/samr/dcesrv_samr.c | 7 +-
source4/torture/smb2/session.c | 629 +++++++++++++++++++++
source4/wscript_build | 5 +
79 files changed, 2469 insertions(+), 272 deletions(-)
copy lib/ldb/ABI/{ldb-2.8.0.sigs => ldb-2.8.1.sigs} (100%)
create mode 100644 python/samba/tests/blackbox/http_chunk.py
create mode 100644 python/samba/tests/blackbox/http_content.py
create mode 100644 selftest/flapping.d/gitlab-setxattr-security
delete mode 100644 selftest/knownfail.d/smbcacls
create mode 100644 source4/client/http_test.c
Changeset truncated at 500 lines:
diff --git a/.gitlab-ci-coverage-runners.yml b/.gitlab-ci-coverage-runners.yml
index 0f6b2ec1581..331c5d2399c 100644
--- a/.gitlab-ci-coverage-runners.yml
+++ b/.gitlab-ci-coverage-runners.yml
@@ -1,10 +1,4 @@
include:
- /.gitlab-ci-default-runners.yml
-.shared_runner_test:
- # We need the more powerful n1-standard-2 runners
- # in order to handle the lcov overhead.
- #
- # See .gitlab-ci-default-runners.yml for more details
- tags:
- - gitlab-org-docker
+# Currently we're happy with the defaults
diff --git a/.gitlab-ci-default-runners.yml b/.gitlab-ci-default-runners.yml
index 2dea6e82c49..bdc504aff21 100644
--- a/.gitlab-ci-default-runners.yml
+++ b/.gitlab-ci-default-runners.yml
@@ -1,48 +1,26 @@
-# From https://docs.gitlab.com/ee/user/gitlab_com/#shared-runners:
+# From https://docs.gitlab.com/ee/ci/runners/hosted_runners/linux.html
#
# ...
#
-# All your CI/CD jobs run on n1-standard-1 instances with 3.75GB of RAM, CoreOS
-# and the latest Docker Engine installed. Instances provide 1 vCPU and 25GB of
-# HDD disk space. The default region of the VMs is US East1. Each instance is
-# used only for one job, this ensures any sensitive data left on the system can’t
-# be accessed by other people their CI jobs.
-#
-# The gitlab-shared-runners-manager-X.gitlab.com fleet of runners are dedicated
-# for GitLab projects as well as community forks of them. They use a slightly
-# larger machine type (n1-standard-2) and have a bigger SSD disk size. They don’t
-# run untagged jobs and unlike the general fleet of shared runners, the instances
-# are re-used up to 40 times.
-#
-# ...
-#
-# The n1-standard-1 runners seem to be tagged with 'docker' together with 'gce'.
-#
-# The more powerful n1-standard-2 runners seem to be tagged with
-# 'gitlab-org-docker' or some with just 'gitlab-org'.
-#
+# Runner Tag vCPUs Memory Storage
+# saas-linux-small-amd64 2 8 GB 25 GB
#
# Our current private runner 'docker', 'samba-ci-private', 'shared' and
-# 'ubuntu1804'. It runs with an ubuntu1804 kernel and privides an ext4 filesystem
-# and similar RAM as the n1-standard-2 runners.
+# 'ubuntu2204'. It runs with an ubuntu2204 kernel (5.15) and provides an
+# ext4 filesystem, 2 CPU and 4 GB (shared tag) 8G (samba-ci-private tag) RAM.
#
.shared_runner_build:
- # We use n1-standard-1 shared runners by default.
- #
- # There are currently 5 shared runners with 'docker' and 'gce',
- # while there are only 2 provising 'docker' together with 'shared'.
+ # We use saas-linux-small-amd64 shared runners by default.
+ # We avoid adding explicit tags for them in order
+ # to work with potential changes in future
#
- # We used to fallback to our private runner if the docker+shared runners
- # were busy, but now that we use the 5 docker+gce runners, we try to only
- # use shared runners without a fallback to our private runner!
- # Lets see how that will work out.
- tags:
- - docker
- - gce
+ # In order to generate valid yaml, we define a dummy variable...
+ variables:
+ SAMBA_SHARED_RUNNER_BUILD_DUMMY_VARIABLE: shared_runner_build
.shared_runner_test:
- # Currently we're fine using the n1-standard-1 runners also for testing
+ # We use saas-linux-small-amd64 shared runners by default.
extends: .shared_runner_build
.private_runner_test:
diff --git a/.gitlab-ci-main.yml b/.gitlab-ci-main.yml
index 779eedb8255..4e4addf5d1a 100644
--- a/.gitlab-ci-main.yml
+++ b/.gitlab-ci-main.yml
@@ -112,8 +112,14 @@ include:
before_script:
- uname -a
+ - ls -l /sys/module/
+ - ls -l /sys/kernel/security/
+ - if [ -e /sys/kernel/security/lsm ]; then cat /sys/kernel/security/lsm ; echo; fi
+ - if [ -e /proc/config.gz ]; then sudo zcat /proc/config.gz; echo; fi
- lsb_release -a
- cat /etc/os-release
+ - id
+ - cat /proc/self/status
- lscpu
- cat /proc/cpuinfo
- mount
diff --git a/VERSION b/VERSION
index 066af506941..44318cde503 100644
--- a/VERSION
+++ b/VERSION
@@ -27,7 +27,7 @@ SAMBA_COPYRIGHT_STRING="Copyright Andrew Tridgell and the Samba Team 1992-2023"
########################################################
SAMBA_VERSION_MAJOR=4
SAMBA_VERSION_MINOR=19
-SAMBA_VERSION_RELEASE=6
+SAMBA_VERSION_RELEASE=7
########################################################
# If a official release has a serious bug #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index be2edfb6ac4..fa27ad5083b 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,3 +1,66 @@
+ ==============================
+ Release Notes for Samba 4.19.7
+ June 10, 2024
+ ==============================
+
+
+This is the latest stable release of the Samba 4.19 release series.
+
+
+Changes since 4.19.6
+--------------------
+
+o Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
+ * BUG 15569: ldb qsort might r/w out of bounds with an intransitive compare
+ function (ldb 2.8.1 is already released).
+ * BUG 15625: Many qsort() comparison functions are non-transitive, which can
+ lead to out-of-bounds access in some circumstances (ldb 2.8.1 is already
+ released).
+
+o Andrew Bartlett <abartlet at samba.org>
+ * BUG 15638: Need to change gitlab-ci.yml tags in all branches to avoid CI
+ bill.
+
+o Stefan Metzmacher <metze at samba.org>
+ * BUG 14981: netr_LogonSamLogonEx returns NR_STATUS_ACCESS_DENIED with
+ SysvolReady=0.
+ * BUG 15412: Anonymous smb3 signing/encryption should be allowed (similar to
+ Windows Server 2022).
+ * BUG 15573: Panic in dreplsrv_op_pull_source_apply_changes_trigger.
+ * BUG 15642: winbindd, net ads join and other things don't work on an ipv6
+ only host.
+
+o Anna Popova <popova.anna235 at gmail.com>
+ * BUG 15636: Smbcacls incorrectly propagates inheritance with Inherit-Only
+ flag.
+
+o Noel Power <noel.power at suse.com>
+ * BUG 15611: http library doesn't support 'chunked transfer encoding'.
+
+
+#######################################
+Reporting bugs & Development Discussion
+#######################################
+
+Please discuss this release on the samba-technical mailing list or by
+joining the #samba-technical:matrix.org matrix room, or
+#samba-technical IRC channel on irc.libera.chat.
+
+If you do report problems then please try to send high quality
+feedback. If you don't provide vital information to help us track down
+the problem then you will probably be ignored. All bug reports should
+be filed under the Samba 4.1 and newer product in the project's Bugzilla
+database (https://bugzilla.samba.org/).
+
+
+======================================================================
+== Our Code, Our Bugs, Our Responsibility.
+== The Samba Team
+======================================================================
+
+
+Release notes for older releases follow:
+----------------------------------------
==============================
Release Notes for Samba 4.19.6
April 08, 2024
@@ -52,8 +115,7 @@ database (https://bugzilla.samba.org/).
======================================================================
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
==============================
Release Notes for Samba 4.19.5
February 19, 2024
diff --git a/auth/gensec/gensec_start.c b/auth/gensec/gensec_start.c
index b6979812ac0..4511674c8eb 100644
--- a/auth/gensec/gensec_start.c
+++ b/auth/gensec/gensec_start.c
@@ -1103,7 +1103,7 @@ _PUBLIC_ const struct gensec_critical_sizes *gensec_interface_version(void)
}
static int sort_gensec(const struct gensec_security_ops **gs1, const struct gensec_security_ops **gs2) {
- return (*gs2)->priority - (*gs1)->priority;
+ return NUMERIC_CMP((*gs2)->priority, (*gs1)->priority);
}
int gensec_setting_int(struct gensec_settings *settings, const char *mechanism, const char *name, int default_value)
diff --git a/lib/fuzzing/decode_ndr_X_crash b/lib/fuzzing/decode_ndr_X_crash
index 63c3cd747d7..d90e7efe122 100755
--- a/lib/fuzzing/decode_ndr_X_crash
+++ b/lib/fuzzing/decode_ndr_X_crash
@@ -61,8 +61,9 @@ def process_one_file(f):
def main():
parser = argparse.ArgumentParser()
- parser.add_argument('-p', '--pipe', default='$PIPE',
- help='pipe name (for output command line)')
+ parser.add_argument('-p', '--pipe', default=None,
+ help=('pipe name (for output command line, '
+ 'default is a guess or "$PIPE")'))
parser.add_argument('-t', '--type', default=None, choices=TYPES,
help='restrict to this type')
parser.add_argument('-o', '--opnum', default=None, type=int,
@@ -91,6 +92,13 @@ def main():
sys.exit(1)
for fn in args.FILES:
+ if pipe is None:
+ m = re.search(r'clusterfuzz-testcase.+-fuzz_ndr_([a-z]+)', fn)
+ if m is None:
+ pipe = '$PIPE'
+ else:
+ pipe = m.group(1)
+
if args.crash_filter is not None:
if not re.search(args.crash_filter, fn):
print_if_verbose(f"skipping {fn}")
diff --git a/lib/ldb-samba/ldif_handlers.c b/lib/ldb-samba/ldif_handlers.c
index f77a268c1a8..e339c1c8b10 100644
--- a/lib/ldb-samba/ldif_handlers.c
+++ b/lib/ldb-samba/ldif_handlers.c
@@ -150,36 +150,47 @@ bool ldif_comparision_objectSid_isString(const struct ldb_val *v)
/*
compare two objectSids
+
+ If the SIDs seem to be strings, they are converted to binary form.
*/
static int ldif_comparison_objectSid(struct ldb_context *ldb, void *mem_ctx,
const struct ldb_val *v1, const struct ldb_val *v2)
{
- if (ldif_comparision_objectSid_isString(v1) && ldif_comparision_objectSid_isString(v2)) {
- return ldb_comparison_binary(ldb, mem_ctx, v1, 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) {
- /* Perhaps not a string after all */
- return ldb_comparison_binary(ldb, mem_ctx, v1, v2);
+ bool v1_is_string = ldif_comparision_objectSid_isString(v1);
+ bool v2_is_string = ldif_comparision_objectSid_isString(v2);
+ struct ldb_val parsed_1 = {};
+ struct ldb_val parsed_2 = {};
+ int ret;
+ /*
+ * If the ldb_vals look like SID strings (i.e. start with "S-"
+ * or "s-"), we try to parse them as such. If that fails, we
+ * assume they are binary SIDs, even though that's not really
+ * possible -- the first two bytes of a struct dom_sid are the
+ * version (1), and the number of sub-auths (<= 15), neither
+ * of which are close to 'S' or '-'.
+ */
+ if (v1_is_string) {
+ int r = ldif_read_objectSid(ldb, mem_ctx, v1, &parsed_1);
+ if (r == 0) {
+ v1 = &parsed_1;
}
- ret = ldb_comparison_binary(ldb, mem_ctx, &v, v2);
- talloc_free(v.data);
- return ret;
- } 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) {
- /* Perhaps not a string after all */
- return ldb_comparison_binary(ldb, mem_ctx, v1, v2);
+ }
+ if (v2_is_string) {
+ int r = ldif_read_objectSid(ldb, mem_ctx, v2, &parsed_2);
+ if (r == 0) {
+ v2 = &parsed_2;
}
- ret = ldb_comparison_binary(ldb, mem_ctx, v1, &v);
- talloc_free(v.data);
- return ret;
}
- return ldb_comparison_binary(ldb, mem_ctx, v1, v2);
+
+ ret = ldb_comparison_binary(ldb, mem_ctx, v1, v2);
+
+ if (v1_is_string) {
+ TALLOC_FREE(parsed_1.data);
+ }
+ if (v2_is_string) {
+ TALLOC_FREE(parsed_2.data);
+ }
+ return ret;
}
/*
@@ -1148,22 +1159,41 @@ static int samba_ldb_dn_link_comparison(struct ldb_context *ldb, void *mem_ctx,
struct ldb_dn *dn1 = NULL, *dn2 = NULL;
int ret;
+ /*
+ * In a sort context, Deleted DNs get shifted to the end.
+ * They never match in an equality
+ */
if (dsdb_dn_is_deleted_val(v1)) {
- /* If the DN is deleted, then we can't search for it */
- return -1;
- }
-
- if (dsdb_dn_is_deleted_val(v2)) {
- /* If the DN is deleted, then we can't search for it */
+ if (! dsdb_dn_is_deleted_val(v2)) {
+ return 1;
+ }
+ /*
+ * They are both deleted!
+ *
+ * The soundest thing to do at this point is carry on
+ * and compare the DNs normally. This matches the
+ * behaviour of samba_dn_extended_match() below.
+ */
+ } else if (dsdb_dn_is_deleted_val(v2)) {
return -1;
}
dn1 = ldb_dn_from_ldb_val(mem_ctx, ldb, v1);
- if ( ! ldb_dn_validate(dn1)) return -1;
-
dn2 = ldb_dn_from_ldb_val(mem_ctx, ldb, v2);
+
+ if ( ! ldb_dn_validate(dn1)) {
+ TALLOC_FREE(dn1);
+ if ( ! ldb_dn_validate(dn2)) {
+ TALLOC_FREE(dn2);
+ return 0;
+ }
+ TALLOC_FREE(dn2);
+ return 1;
+ }
+
if ( ! ldb_dn_validate(dn2)) {
- talloc_free(dn1);
+ TALLOC_FREE(dn1);
+ TALLOC_FREE(dn2);
return -1;
}
diff --git a/lib/ldb/ABI/ldb-2.8.0.sigs b/lib/ldb/ABI/ldb-2.8.1.sigs
similarity index 100%
copy from lib/ldb/ABI/ldb-2.8.0.sigs
copy to lib/ldb/ABI/ldb-2.8.1.sigs
diff --git a/lib/ldb/common/attrib_handlers.c b/lib/ldb/common/attrib_handlers.c
index 15470cfcc74..3d13e4bd9fd 100644
--- a/lib/ldb/common/attrib_handlers.c
+++ b/lib/ldb/common/attrib_handlers.c
@@ -281,15 +281,36 @@ static int ldb_canonicalise_Boolean(struct ldb_context *ldb, void *mem_ctx,
}
/*
- compare two Booleans
-*/
+ * compare two Booleans.
+ *
+ * According to RFC4517 4.2.2, "the booleanMatch rule is an equality matching
+ * rule", meaning it isn't used for ordering.
+ *
+ * However, it seems conceivable that Samba could be coerced into sorting on a
+ * field with Boolean syntax, so we might as well have consistent behaviour in
+ * that case.
+ *
+ * The most probably values are {"FALSE", 5} and {"TRUE", 4}. To save time we
+ * compare first by length, which makes FALSE > TRUE. This is somewhat
+ * contrary to convention, but is how Samba has worked forever.
+ *
+ * If somehow we are comparing incompletely normalised values where the length
+ * is the same (for example {"false", 5} and {"TRUE\0", 5}), the length is the
+ * same, and we fall back to a strncasecmp. In this case, since "FALSE" is
+ * alphabetically lower, we swap the order, so that "TRUE\0" again comes
+ * before "FALSE".
+ *
+ * ldb_canonicalise_Boolean (just above) gives us a clue as to what we might
+ * expect to cope with by way of invalid values.
+ */
static int ldb_comparison_Boolean(struct ldb_context *ldb, void *mem_ctx,
const struct ldb_val *v1, const struct ldb_val *v2)
{
if (v1->length != v2->length) {
- return v1->length - v2->length;
+ return NUMERIC_CMP(v2->length, v1->length);
}
- return strncasecmp((char *)v1->data, (char *)v2->data, v1->length);
+ /* reversed, see long comment above */
+ return strncasecmp((char *)v2->data, (char *)v1->data, v1->length);
}
@@ -300,7 +321,7 @@ int ldb_comparison_binary(struct ldb_context *ldb, void *mem_ctx,
const struct ldb_val *v1, const struct ldb_val *v2)
{
if (v1->length != v2->length) {
- return v1->length - v2->length;
+ return NUMERIC_CMP(v1->length, v2->length);
}
return memcmp(v1->data, v2->data, v1->length);
}
@@ -372,17 +393,27 @@ utf8str:
b2 = ldb_casefold(ldb, mem_ctx, s2, n2);
if (!b1 || !b2) {
- /* One of the strings was not UTF8, so we have no
- * options but to do a binary compare */
+ /*
+ * One of the strings was not UTF8, so we have no
+ * options but to do a binary compare.
+ */
talloc_free(b1);
talloc_free(b2);
ret = memcmp(s1, s2, MIN(n1, n2));
if (ret == 0) {
- if (n1 == n2) return 0;
+ if (n1 == n2) {
+ return 0;
+ }
if (n1 > n2) {
- return (int)ldb_ascii_toupper(s1[n2]);
+ if (s1[n2] == '\0') {
+ return 0;
+ }
+ return 1;
} else {
- return -(int)ldb_ascii_toupper(s2[n1]);
+ if (s2[n1] == '\0') {
+ return 0;
+ }
+ return -1;
}
}
return ret;
@@ -404,7 +435,7 @@ utf8str:
while (*u1 == ' ') u1++;
while (*u2 == ' ') u2++;
}
- ret = (int)(*u1 - *u2);
+ ret = NUMERIC_CMP(*u1, *u2);
talloc_free(b1);
talloc_free(b2);
diff --git a/lib/ldb/common/ldb_dn.c b/lib/ldb/common/ldb_dn.c
index 601da57a1b1..8388fdb7318 100644
--- a/lib/ldb/common/ldb_dn.c
+++ b/lib/ldb/common/ldb_dn.c
@@ -1111,7 +1111,7 @@ int ldb_dn_compare_base(struct ldb_dn *base, struct ldb_dn *dn)
/* compare attr.cf_value. */
if (b_vlen != dn_vlen) {
- return b_vlen - dn_vlen;
+ return NUMERIC_CMP(b_vlen, dn_vlen);
}
ret = strncmp(b_vdata, dn_vdata, b_vlen);
if (ret != 0) return ret;
@@ -1132,8 +1132,32 @@ int ldb_dn_compare(struct ldb_dn *dn0, struct ldb_dn *dn1)
{
unsigned int i;
int ret;
+ /*
+ * If used in sort, we shift NULL and invalid DNs to the end.
+ *
+ * If ldb_dn_casefold_internal() fails, that goes to the end too, so
+ * we end up with:
+ *
+ * | normal DNs, sorted | casefold failed DNs | invalid DNs | NULLs |
+ */
- if (( ! dn0) || dn0->invalid || ! dn1 || dn1->invalid) {
+ if (dn0 == dn1) {
+ /* this includes the both-NULL case */
+ return 0;
+ }
+ if (dn0 == NULL) {
+ return 1;
+ }
+ if (dn1 == NULL) {
+ return -1;
+ }
--
Samba Shared Repository
More information about the samba-cvs
mailing list