[SCM] Samba Shared Repository - branch master updated

Jule Anger janger at samba.org
Fri Jul 21 13:04:01 UTC 2023


The branch, master has been updated
       via  9bab902fc50 CVE-2023-3347: smbd: fix "server signing = mandatory"
       via  5a222ac3718 CVE-2023-3347: smbd: remove comment in smbd_smb2_request_process_negprot()
       via  59131d6c345 CVE-2023-3347: smbd: inline smb2_srv_init_signing() code in srv_init_signing()
       via  1662eeeb7a6 CVE-2023-3347: smbd: pass lp_ctx to smb[1|2]_srv_init_signing()
       via  a9a2b182df7 CVE-2023-3347: CI: add a test for server-side mandatory signing
       via  578e434a941 CVE-2023-34968: mdssvc: return a fake share path
       via  94fcbec8af5 CVE-2023-34968: mdscli: return share relative paths
       via  d402c0cc6ad CVE-2023-34968: mdssvc: introduce an allocating wrapper to sl_pack()
       via  ac9008a20c8 CVE-2023-34968: mdssvc: switch to doing an early return
       via  33b82c6185b CVE-2023-34968: mdssvc: remove response blob allocation
       via  5c9efa9604d CVE-2023-34968: rpcclient: remove response blob allocation
       via  6d77daa3af0 CVE-2023-34968: smbtorture: remove response blob allocation in mdssvc.c
       via  e85e09eee93 CVE-2023-34968: mdscli: remove response blob allocation
       via  617fe37cc2a CVE-2023-34968: mdscli: use correct TALLOC memory context when allocating spotlight_blob
       via  70184ef3b40 CVE-2023-34968: mdssvc: add missing "kMDSStoreMetaScopes" dict key in slrpc_fetch_properties()
       via  02552493e37 CVE-2023-34968: mdssvc: cache and reuse stat info in struct sl_inode_path_map
       via  4c60e35add4 CVE-2023-34967: mdssvc: add type checking to dalloc_value_for_key()
       via  3b3c30e2acf CVE-2023-34967: CI: add a test for type checking of dalloc_value_for_key()
       via  38664163fca CVE-2023-34966: mdssvc: harden sl_unpack_loop()
       via  10b6890d26b CVE-2023-34966: CI: test for sl_unpack_loop()
       via  e067c523b17 CVE-2022-2127: ntlm_auth: cap lanman response length value
       via  b2de71734f0 CVE-2022-2127: winbindd: Fix WINBINDD_PAM_AUTH_CRAP length checks
      from  76ad44f446c lib/cmdline: Also redact --newpassword in samba_cmdline_burn()

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 9bab902fc50f88869b253c4089d83b3e33a1075a
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 20 15:33:02 2023 +0200

    CVE-2023-3347: smbd: fix "server signing = mandatory"
    
    This was broken by commit 1f3f6e20dc086a36de52bffd0bc36e15fb19e1c6 because when
    calling srv_init_signing() very early after accepting the connection in
    smbd_add_connection(), conn->protocol is still PROTOCOL_NONE.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15397
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    
    Autobuild-User(master): Jule Anger <janger at samba.org>
    Autobuild-Date(master): Fri Jul 21 13:03:09 UTC 2023 on atb-devel-224

commit 5a222ac37183ba5dd717d81c7e57f78e59695a67
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 20 18:13:23 2023 +0200

    CVE-2023-3347: smbd: remove comment in smbd_smb2_request_process_negprot()
    
    This is just going to bitrot. Anyone who's interested can just grep for
    "signing_mandatory" and look up what it does.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15397
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit 59131d6c345864dcf1ed3331c52ce35ddc5db2dc
Author: Ralph Boehme <slow at samba.org>
Date:   Wed Jun 21 15:10:58 2023 +0200

    CVE-2023-3347: smbd: inline smb2_srv_init_signing() code in srv_init_signing()
    
    It's now a one-line function, imho the overall code is simpler if that code is
    just inlined.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15397
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit 1662eeeb7a6fc1b955fc0f7f52c7546ba3ac442a
Author: Ralph Boehme <slow at samba.org>
Date:   Wed Jun 21 15:06:12 2023 +0200

    CVE-2023-3347: smbd: pass lp_ctx to smb[1|2]_srv_init_signing()
    
    No change in behaviour.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15397
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit a9a2b182df738fd283f820e162d189d20010ad63
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 20 12:46:31 2023 +0200

    CVE-2023-3347: CI: add a test for server-side mandatory signing
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15397
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit 578e434a94147dc2d7dbfc006d2ab84807859c1d
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Jun 5 18:02:20 2023 +0200

    CVE-2023-34968: mdssvc: return a fake share path
    
    Instead of returning the real server-side absolute path of shares and search
    results, return a fake absolute path replacing the path of the share with the
    share name, iow for a share "test" with a server-side path of "/foo/bar", we
    previously returned
    
      /foo/bar and
      /foo/bar/search/result
    
    and now return
    
      /test and
      /test/search/result
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 94fcbec8af5cd877e43ca125912cff0d867f7215
Author: Ralph Boehme <slow at samba.org>
Date:   Sat Jun 17 13:53:27 2023 +0200

    CVE-2023-34968: mdscli: return share relative paths
    
    The next commit will change the Samba Spotlight server to return absolute paths
    that start with the sharename as "/SHARENAME/..." followed by the share path
    relative appended.
    
    So given a share
    
      [spotlight]
        path = /foo/bar
        spotlight = yes
    
    and a file inside this share with a full path of
    
      /foo/bar/dir/file
    
    previously a search that matched this file would returns the absolute
    server-side pato of the file, ie
    
      /foo/bar/dir/file
    
    This will be change to
    
      /spotlight/dir/file
    
    As currently the mdscli library and hence the mdsearch tool print out these
    paths returned from the server, we have to change the output to accomodate these
    fake paths. The only way to do this sensibly is by makeing the paths relative to
    the containing share, so just
    
      dir/file
    
    in the example above.
    
    The client learns about the share root path prefix – real server-side of fake in
    the future – in an initial handshake in the "share_path" out argument of the
    mdssvc_open() RPC call, so the client can use this path to convert the absolute
    path to relative.
    
    There is however an additional twist: the macOS Spotlight server prefixes this
    absolute path with another prefix, typically "/System/Volumes/Data", so in the
    example above the full path for the same search would be
    
      /System/Volumes/Data/foo/bar/dir/file
    
    So macOS does return the full server-side path too, just prefixed with an
    additional path. This path prefixed can be queried by the client in the
    mdssvc_cmd() RPC call with an Spotlight command of "fetchPropertiesForContext:"
    and the path is returned in a dictionary with key "kMDSStorePathScopes". Samba
    just returns "/" for this.
    
    Currently the mdscli library doesn't issue this Spotlight RPC
    request (fetchPropertiesForContext), so this is added in this commit. In the
    end, all search result paths are stripped of the combined prefix
    
      kMDSStorePathScopes + share_path (from mdssvc_open).
    
    eg
    
      kMDSStorePathScopes = /System/Volumes/Data
      share_path = /foo/bar
      search result = /System/Volumes/Data/foo/bar/dir/file
      relative path returned by mdscli = dir/file
    
    Makes sense? :)
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit d402c0cc6add369885d990fedbe71ef5185a245b
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Jun 19 18:16:57 2023 +0200

    CVE-2023-34968: mdssvc: introduce an allocating wrapper to sl_pack()
    
    sl_pack_alloc() does the buffer allocation that previously all callers of
    sl_pack() did themselves.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit ac9008a20c8954471c65694f92cf2029f947d0d1
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 20 11:05:22 2023 +0200

    CVE-2023-34968: mdssvc: switch to doing an early return
    
    Just reduce indentation of the code handling the success case. No change in
    behaviour.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 33b82c6185b09a5bc356de412ef815297acc66b6
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 20 11:42:10 2023 +0200

    CVE-2023-34968: mdssvc: remove response blob allocation
    
    This is alreay done by NDR for us.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 5c9efa9604d843208b6e5f078e6bbf62d0ee16ab
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 20 11:35:41 2023 +0200

    CVE-2023-34968: rpcclient: remove response blob allocation
    
    This is alreay done by NDR for us.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 6d77daa3af070a06a2d9bc7f67618ddfaa92eb14
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 20 11:28:47 2023 +0200

    CVE-2023-34968: smbtorture: remove response blob allocation in mdssvc.c
    
    This is alreay done by NDR for us.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit e85e09eee93a6332112fff6b7c7107044ace7aa6
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Jun 19 18:28:41 2023 +0200

    CVE-2023-34968: mdscli: remove response blob allocation
    
    This is handled by the NDR code transparently.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 617fe37cc2a910debf306f7376f8776054154106
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Jun 19 17:14:38 2023 +0200

    CVE-2023-34968: mdscli: use correct TALLOC memory context when allocating spotlight_blob
    
    d is talloc_free()d at the end of the functions and the buffer was later used
    after beeing freed in the DCERPC layer when sending the packet.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 70184ef3b40a0b0a7c7da464191e93f37de8a968
Author: Ralph Boehme <slow at samba.org>
Date:   Sat Jun 17 13:39:55 2023 +0200

    CVE-2023-34968: mdssvc: add missing "kMDSStoreMetaScopes" dict key in slrpc_fetch_properties()
    
    We were adding the value, but not the key.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 02552493e37dc28f0aeff64ccc991c92eb517d1e
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 6 15:17:26 2023 +0200

    CVE-2023-34968: mdssvc: cache and reuse stat info in struct sl_inode_path_map
    
    Prepare for the "path" being a fake path and not the real server-side
    path where we won't be able to vfs_stat_fsp() this fake path. Luckily we already
    got stat info for the object in mds_add_result() so we can just pass stat info
    from there.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 4c60e35add4a1abd04334012a8d6edf1c3f396ba
Author: Ralph Boehme <slow at samba.org>
Date:   Fri May 26 15:06:38 2023 +0200

    CVE-2023-34967: mdssvc: add type checking to dalloc_value_for_key()
    
    Change the dalloc_value_for_key() function to require an additional final
    argument which denotes the expected type of the value associated with a key. If
    the types don't match, return NULL.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15341
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit 3b3c30e2acfb00d04c4013e32343bc277d5b1aa8
Author: Ralph Boehme <slow at samba.org>
Date:   Wed May 31 16:26:14 2023 +0200

    CVE-2023-34967: CI: add a test for type checking of dalloc_value_for_key()
    
    Sends a maliciously crafted packet where the value in a key/value style
    dictionary for the "scope" key is a simple string object whereas the server
    expects an array. As the server doesn't perform type validation on the value, it
    crashes when trying to use the "simple" object as a "complex" one.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15341
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit 38664163fcac985d87e4274d198568e0fe88595e
Author: Ralph Boehme <slow at samba.org>
Date:   Fri May 26 13:06:19 2023 +0200

    CVE-2023-34966: mdssvc: harden sl_unpack_loop()
    
    A malicious client could send a packet where subcount is zero, leading to a busy
    loop because
    
        count -= subcount
    =>  count -= 0
    =>  while (count > 0)
    
    loops forever.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15340
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit 10b6890d26b3c7a829a9e9a05ad1d1ff54daeca9
Author: Ralph Boehme <slow at samba.org>
Date:   Wed May 31 15:34:26 2023 +0200

    CVE-2023-34966: CI: test for sl_unpack_loop()
    
    Send a maliciously crafted packet where a nil type has a subcount of 0. This
    triggers an endless loop in mdssvc sl_unpack_loop().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15340
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit e067c523b17951a93b6daafd349e9371f8f81e56
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Jun 16 12:28:47 2023 +0200

    CVE-2022-2127: ntlm_auth: cap lanman response length value
    
    We already copy at most sizeof(request.data.auth_crap.lm_resp) bytes to the
    lm_resp buffer, but we don't cap the length indicator.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15072
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit b2de71734f09ee4eb80cf70de8a66f628246f2ba
Author: Volker Lendecke <vl at samba.org>
Date:   Fri May 20 10:55:23 2022 +0200

    CVE-2022-2127: winbindd: Fix WINBINDD_PAM_AUTH_CRAP length checks
    
    With WBFLAG_BIG_NTLMV2_BLOB being set plus lm_resp_len too large you
    can crash winbind. We don't independently check lm_resp_len
    sufficiently.
    
    Discovered via Coverity ID 1504444 Out-of-bounds access
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15072
    
    Signed-off-by: Volker Lendecke <vl at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 python/samba/tests/blackbox/mdsearch.py   |   8 +-
 python/samba/tests/dcerpc/mdssvc.py       |  26 ++--
 selftest/target/Samba3.pm                 |   1 +
 source3/rpc_client/cli_mdssvc.c           | 191 ++++++++++++++++++-----
 source3/rpc_client/cli_mdssvc_private.h   |   4 +
 source3/rpc_client/cli_mdssvc_util.c      | 148 ++++++++++--------
 source3/rpc_client/cli_mdssvc_util.h      |   4 +
 source3/rpc_server/mdssvc/dalloc.c        |  14 +-
 source3/rpc_server/mdssvc/marshalling.c   |  45 ++++--
 source3/rpc_server/mdssvc/marshalling.h   |   9 +-
 source3/rpc_server/mdssvc/mdssvc.c        | 142 +++++++++++------
 source3/rpc_server/mdssvc/mdssvc.h        |   7 +-
 source3/rpc_server/mdssvc/srv_mdssvc_nt.c |  32 ++--
 source3/rpcclient/cmd_spotlight.c         |  48 +-----
 source3/selftest/tests.py                 |   2 +
 source3/smbd/proto.h                      |   1 -
 source3/smbd/smb1_signing.c               |  10 +-
 source3/smbd/smb1_signing.h               |   3 +-
 source3/smbd/smb2_negprot.c               |   6 -
 source3/smbd/smb2_signing.c               |  23 ++-
 source3/utils/ntlm_auth.c                 |   8 +-
 source3/winbindd/winbindd_pam_auth_crap.c |  31 ++--
 source4/torture/rpc/mdssvc.c              | 250 ++++++++++++++++++++++++++----
 source4/torture/smb2/session.c            |  64 ++++++++
 source4/torture/smb2/smb2.c               |   1 +
 25 files changed, 769 insertions(+), 309 deletions(-)


Changeset truncated at 500 lines:

diff --git a/python/samba/tests/blackbox/mdsearch.py b/python/samba/tests/blackbox/mdsearch.py
index c9156ae6e0e..c8e75661f15 100644
--- a/python/samba/tests/blackbox/mdsearch.py
+++ b/python/samba/tests/blackbox/mdsearch.py
@@ -76,10 +76,7 @@ class MdfindBlackboxTests(BlackboxTestCase):
         self.t.start()
         time.sleep(1)
 
-        pipe = mdssvc.mdssvc('ncacn_np:fileserver[/pipe/mdssvc]', self.get_loadparm())
-        conn = mdscli.conn(pipe, 'spotlight', '/foo')
-        self.sharepath = conn.sharepath()
-        conn.disconnect(pipe)
+        self.sharepath = os.environ["LOCAL_PATH"]
 
         for file in testfiles:
             f = open("%s/%s" % (self.sharepath, file), "w")
@@ -126,5 +123,4 @@ class MdfindBlackboxTests(BlackboxTestCase):
         output = self.check_output("mdsearch --configfile=%s -U %s%%%s fileserver spotlight '*==\"samba*\"'" % (config, username, password))
 
         actual = output.decode('utf-8').splitlines()
-        expected = ["%s/%s" % (self.sharepath, file) for file in testfiles]
-        self.assertEqual(expected, actual)
+        self.assertEqual(testfiles, actual)
diff --git a/python/samba/tests/dcerpc/mdssvc.py b/python/samba/tests/dcerpc/mdssvc.py
index b0df509ddc7..5002e5d26d6 100644
--- a/python/samba/tests/dcerpc/mdssvc.py
+++ b/python/samba/tests/dcerpc/mdssvc.py
@@ -84,10 +84,11 @@ class MdssvcTests(RpcInterfaceTestCase):
         self.t = threading.Thread(target=MdssvcTests.http_server, args=(self,))
         self.t.setDaemon(True)
         self.t.start()
+        self.sharepath = os.environ["LOCAL_PATH"]
         time.sleep(1)
 
         conn = mdscli.conn(self.pipe, 'spotlight', '/foo')
-        self.sharepath = conn.sharepath()
+        self.fakepath = conn.sharepath()
         conn.disconnect(self.pipe)
 
         for file in testfiles:
@@ -105,12 +106,11 @@ class MdssvcTests(RpcInterfaceTestCase):
         self.server.serve_forever()
 
     def run_test(self, query, expect, json_in, json_out):
-        expect = [s.replace("%BASEPATH%", self.sharepath) for s in expect]
         self.server.json_in = json_in.replace("%BASEPATH%", self.sharepath)
         self.server.json_out = json_out.replace("%BASEPATH%", self.sharepath)
 
         self.conn = mdscli.conn(self.pipe, 'spotlight', '/foo')
-        search = self.conn.search(self.pipe, query, self.sharepath)
+        search = self.conn.search(self.pipe, query, self.fakepath)
 
         # Give it some time, the get_results() below returns immediately
         # what's available, so if we ask to soon, we might get back no results
@@ -141,7 +141,7 @@ class MdssvcTests(RpcInterfaceTestCase):
             ]
           }
         }'''
-        exp_results = ["%BASEPATH%/foo", "%BASEPATH%/bar"]
+        exp_results = ["foo", "bar"]
         self.run_test('*=="samba*"', exp_results, exp_json_query, fake_json_response)
 
     def test_mdscli_search_escapes(self):
@@ -181,14 +181,14 @@ class MdssvcTests(RpcInterfaceTestCase):
           }
         }'''
         exp_results = [
-            r"%BASEPATH%/x+x",
-            r"%BASEPATH%/x*x",
-            r"%BASEPATH%/x=x",
-            r"%BASEPATH%/x'x",
-            r"%BASEPATH%/x?x",
-            r"%BASEPATH%/x x",
-            r"%BASEPATH%/x(x",
-            "%BASEPATH%/x\"x",
-            r"%BASEPATH%/x\x",
+            r"x+x",
+            r"x*x",
+            r"x=x",
+            r"x'x",
+            r"x?x",
+            r"x x",
+            r"x(x",
+            "x\"x",
+            r"x\x",
         ]
         self.run_test(sl_query, exp_results, exp_json_query, fake_json_response)
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index d9e17473615..b4c3c130e9a 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -1295,6 +1295,7 @@ sub setup_ad_member_idmap_rid
 	create krb5 conf = no
         map to guest = bad user
 	winbind expand groups = 10
+	server signing = required
 ";
 
 	my $ret = $self->provision(
diff --git a/source3/rpc_client/cli_mdssvc.c b/source3/rpc_client/cli_mdssvc.c
index 046d37135cb..753bc2e52ed 100644
--- a/source3/rpc_client/cli_mdssvc.c
+++ b/source3/rpc_client/cli_mdssvc.c
@@ -43,10 +43,12 @@ char *mdscli_get_basepath(TALLOC_CTX *mem_ctx,
 struct mdscli_connect_state {
 	struct tevent_context *ev;
 	struct mdscli_ctx *mdscli_ctx;
+	struct mdssvc_blob response_blob;
 };
 
 static void mdscli_connect_open_done(struct tevent_req *subreq);
 static void mdscli_connect_unknown1_done(struct tevent_req *subreq);
+static void mdscli_connect_fetch_props_done(struct tevent_req *subreq);
 
 struct tevent_req *mdscli_connect_send(TALLOC_CTX *mem_ctx,
 				       struct tevent_context *ev,
@@ -111,6 +113,7 @@ static void mdscli_connect_open_done(struct tevent_req *subreq)
 	struct mdscli_connect_state *state = tevent_req_data(
 		req, struct mdscli_connect_state);
 	struct mdscli_ctx *mdscli_ctx = state->mdscli_ctx;
+	size_t share_path_len;
 	NTSTATUS status;
 
 	status = dcerpc_mdssvc_open_recv(subreq, state);
@@ -120,6 +123,18 @@ static void mdscli_connect_open_done(struct tevent_req *subreq)
 		return;
 	}
 
+	share_path_len = strlen(mdscli_ctx->mdscmd_open.share_path);
+	if (share_path_len < 1 || share_path_len > UINT16_MAX) {
+		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+		return;
+	}
+	mdscli_ctx->mdscmd_open.share_path_len = share_path_len;
+
+	if (mdscli_ctx->mdscmd_open.share_path[share_path_len-1] == '/') {
+		mdscli_ctx->mdscmd_open.share_path[share_path_len-1] = '\0';
+		mdscli_ctx->mdscmd_open.share_path_len--;
+	}
+
 	subreq = dcerpc_mdssvc_unknown1_send(
 			state,
 			state->ev,
@@ -146,6 +161,8 @@ static void mdscli_connect_unknown1_done(struct tevent_req *subreq)
 		subreq, struct tevent_req);
 	struct mdscli_connect_state *state = tevent_req_data(
 		req, struct mdscli_connect_state);
+	struct mdscli_ctx *mdscli_ctx = state->mdscli_ctx;
+	struct mdssvc_blob request_blob;
 	NTSTATUS status;
 
 	status = dcerpc_mdssvc_unknown1_recv(subreq, state);
@@ -154,6 +171,108 @@ static void mdscli_connect_unknown1_done(struct tevent_req *subreq)
 		return;
 	}
 
+	status = mdscli_blob_fetch_props(state,
+					 state->mdscli_ctx,
+					 &request_blob);
+	if (tevent_req_nterror(req, status)) {
+		return;
+	}
+
+	subreq = dcerpc_mdssvc_cmd_send(state,
+					state->ev,
+					mdscli_ctx->bh,
+					&mdscli_ctx->ph,
+					0,
+					mdscli_ctx->dev,
+					mdscli_ctx->mdscmd_open.unkn2,
+					0,
+					mdscli_ctx->flags,
+					request_blob,
+					0,
+					mdscli_ctx->max_fragment_size,
+					1,
+					mdscli_ctx->max_fragment_size,
+					0,
+					0,
+					&mdscli_ctx->mdscmd_cmd.fragment,
+					&state->response_blob,
+					&mdscli_ctx->mdscmd_cmd.unkn9);
+	if (tevent_req_nomem(subreq, req)) {
+		return;
+	}
+	tevent_req_set_callback(subreq, mdscli_connect_fetch_props_done, req);
+	mdscli_ctx->async_pending++;
+	return;
+}
+
+static void mdscli_connect_fetch_props_done(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(
+		subreq, struct tevent_req);
+	struct mdscli_connect_state *state = tevent_req_data(
+		req, struct mdscli_connect_state);
+	struct mdscli_ctx *mdscli_ctx = state->mdscli_ctx;
+	DALLOC_CTX *d = NULL;
+	sl_array_t *path_scope_array = NULL;
+	char *path_scope = NULL;
+	NTSTATUS status;
+	bool ok;
+
+	status = dcerpc_mdssvc_cmd_recv(subreq, state);
+	TALLOC_FREE(subreq);
+	state->mdscli_ctx->async_pending--;
+	if (tevent_req_nterror(req, status)) {
+		return;
+	}
+
+	d = dalloc_new(state);
+	if (tevent_req_nomem(d, req)) {
+		return;
+	}
+
+	ok = sl_unpack(d,
+		       (char *)state->response_blob.spotlight_blob,
+		       state->response_blob.length);
+	if (!ok) {
+		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+		return;
+	}
+
+	path_scope_array = dalloc_value_for_key(d,
+						"DALLOC_CTX", 0,
+						"kMDSStorePathScopes",
+						"sl_array_t");
+	if (path_scope_array == NULL) {
+		DBG_ERR("Missing kMDSStorePathScopes\n");
+		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+		return;
+	}
+
+	path_scope = dalloc_get(path_scope_array, "char *", 0);
+	if (path_scope == NULL) {
+		DBG_ERR("Missing path in kMDSStorePathScopes\n");
+		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+		return;
+	}
+
+	mdscli_ctx->path_scope_len = strlen(path_scope);
+	if (mdscli_ctx->path_scope_len < 1 ||
+	    mdscli_ctx->path_scope_len > UINT16_MAX)
+	{
+		DBG_ERR("Bad path_scope: %s\n", path_scope);
+		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+		return;
+	}
+	mdscli_ctx->path_scope = talloc_strdup(mdscli_ctx, path_scope);
+	if (tevent_req_nomem(mdscli_ctx->path_scope, req)) {
+		return;
+	}
+
+	if (mdscli_ctx->path_scope[mdscli_ctx->path_scope_len-1] == '/') {
+		mdscli_ctx->path_scope[mdscli_ctx->path_scope_len-1] = '\0';
+		mdscli_ctx->path_scope_len--;
+	}
+
 	tevent_req_done(req);
 }
 
@@ -276,15 +395,6 @@ struct tevent_req *mdscli_search_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
-	state->response_blob.spotlight_blob = talloc_array(
-		state,
-		uint8_t,
-		mdscli_ctx->max_fragment_size);
-	if (tevent_req_nomem(state->response_blob.spotlight_blob, req)) {
-		return tevent_req_post(req, ev);
-	}
-	state->response_blob.size = mdscli_ctx->max_fragment_size;
-
 	subreq = dcerpc_mdssvc_cmd_send(state,
 					ev,
 					mdscli_ctx->bh,
@@ -457,15 +567,6 @@ struct tevent_req *mdscli_get_results_send(
 		return tevent_req_post(req, ev);
 	}
 
-	state->response_blob.spotlight_blob = talloc_array(
-		state,
-		uint8_t,
-		mdscli_ctx->max_fragment_size);
-	if (tevent_req_nomem(state->response_blob.spotlight_blob, req)) {
-		return tevent_req_post(req, ev);
-	}
-	state->response_blob.size = mdscli_ctx->max_fragment_size;
-
 	subreq = dcerpc_mdssvc_cmd_send(state,
 					ev,
 					mdscli_ctx->bh,
@@ -681,15 +782,6 @@ struct tevent_req *mdscli_get_path_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
-	state->response_blob.spotlight_blob = talloc_array(
-		state,
-		uint8_t,
-		mdscli_ctx->max_fragment_size);
-	if (tevent_req_nomem(state->response_blob.spotlight_blob, req)) {
-		return tevent_req_post(req, ev);
-	}
-	state->response_blob.size = mdscli_ctx->max_fragment_size;
-
 	subreq = dcerpc_mdssvc_cmd_send(state,
 					ev,
 					mdscli_ctx->bh,
@@ -724,7 +816,10 @@ static void mdscli_get_path_done(struct tevent_req *subreq)
 	struct mdscli_get_path_state *state = tevent_req_data(
 		req, struct mdscli_get_path_state);
 	DALLOC_CTX *d = NULL;
+	size_t pathlen;
+	size_t prefixlen;
 	char *path = NULL;
+	const char *p = NULL;
 	NTSTATUS status;
 	bool ok;
 
@@ -759,7 +854,38 @@ static void mdscli_get_path_done(struct tevent_req *subreq)
 		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
 		return;
 	}
-	state->path = talloc_move(state, &path);
+
+	/* Path is prefixed by /PATHSCOPE/SHARENAME/, strip it */
+	pathlen = strlen(path);
+
+	/*
+	 * path_scope_len and share_path_len are already checked to be smaller
+	 * then UINT16_MAX so this can't overflow
+	 */
+	prefixlen = state->mdscli_ctx->path_scope_len
+		+ state->mdscli_ctx->mdscmd_open.share_path_len;
+
+	if (pathlen < prefixlen) {
+		DBG_DEBUG("Bad path: %s\n", path);
+		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+		return;
+	}
+
+	p = path + prefixlen;
+	while (*p == '/') {
+		p++;
+	}
+	if (*p == '\0') {
+		DBG_DEBUG("Bad path: %s\n", path);
+		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+		return;
+	}
+
+	state->path = talloc_strdup(state, p);
+	if (state->path == NULL) {
+		tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
+		return;
+	}
 	DBG_DEBUG("path: %s\n", state->path);
 
 	tevent_req_done(req);
@@ -852,15 +978,6 @@ struct tevent_req *mdscli_close_search_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
-	state->response_blob.spotlight_blob = talloc_array(
-		state,
-		uint8_t,
-		mdscli_ctx->max_fragment_size);
-	if (tevent_req_nomem(state->response_blob.spotlight_blob, req)) {
-		return tevent_req_post(req, ev);
-	}
-	state->response_blob.size = mdscli_ctx->max_fragment_size;
-
 	subreq = dcerpc_mdssvc_cmd_send(state,
 					ev,
 					mdscli_ctx->bh,
diff --git a/source3/rpc_client/cli_mdssvc_private.h b/source3/rpc_client/cli_mdssvc_private.h
index 031af85bf58..77f300c09cc 100644
--- a/source3/rpc_client/cli_mdssvc_private.h
+++ b/source3/rpc_client/cli_mdssvc_private.h
@@ -42,6 +42,7 @@ struct mdscli_ctx {
 	/* cmd specific or unknown fields */
 	struct {
 		char share_path[1025];
+		size_t share_path_len;
 		uint32_t unkn2;
 		uint32_t unkn3;
 	} mdscmd_open;
@@ -56,6 +57,9 @@ struct mdscli_ctx {
 	struct {
 		uint32_t status;
 	} mdscmd_close;
+
+	char *path_scope;
+	size_t path_scope_len;
 };
 
 struct mdscli_search_ctx {
diff --git a/source3/rpc_client/cli_mdssvc_util.c b/source3/rpc_client/cli_mdssvc_util.c
index fe5092c3790..1eaaca715a8 100644
--- a/source3/rpc_client/cli_mdssvc_util.c
+++ b/source3/rpc_client/cli_mdssvc_util.c
@@ -28,6 +28,74 @@
 #include "rpc_server/mdssvc/dalloc.h"
 #include "rpc_server/mdssvc/marshalling.h"
 
+NTSTATUS mdscli_blob_fetch_props(TALLOC_CTX *mem_ctx,
+				 struct mdscli_ctx *ctx,
+				 struct mdssvc_blob *blob)
+{
+	DALLOC_CTX *d = NULL;
+	uint64_t *uint64p = NULL;
+	sl_array_t *array = NULL;
+	sl_array_t *cmd_array = NULL;
+	NTSTATUS status;
+	int ret;
+
+	d = dalloc_new(mem_ctx);
+	if (d == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	array = dalloc_zero(d, sl_array_t);
+	if (array == NULL) {
+		TALLOC_FREE(d);
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	ret = dalloc_add(d, array, sl_array_t);
+	if (ret != 0) {
+		TALLOC_FREE(d);
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	cmd_array = dalloc_zero(d, sl_array_t);
+	if (cmd_array == NULL) {
+		TALLOC_FREE(d);
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	ret = dalloc_add(array, cmd_array, sl_array_t);
+	if (ret != 0) {
+		TALLOC_FREE(d);
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	ret = dalloc_stradd(cmd_array, "fetchPropertiesForContext:");
+	if (ret != 0) {
+		TALLOC_FREE(d);
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	uint64p = talloc_zero_array(cmd_array, uint64_t, 2);
+	if (uint64p == NULL) {
+		TALLOC_FREE(d);
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	talloc_set_name(uint64p, "uint64_t *");
+
+	ret = dalloc_add(cmd_array, uint64p, uint64_t *);
+	if (ret != 0) {
+		TALLOC_FREE(d);
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	status = sl_pack_alloc(mem_ctx, d, blob, ctx->max_fragment_size);
+	TALLOC_FREE(d);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
+	return NT_STATUS_OK;
+}
+
 NTSTATUS mdscli_blob_search(TALLOC_CTX *mem_ctx,
 			    struct mdscli_search_ctx *search,
 			    struct mdssvc_blob *blob)
@@ -42,7 +110,7 @@ NTSTATUS mdscli_blob_search(TALLOC_CTX *mem_ctx,
 	sl_array_t *scope_array = NULL;
 	double dval;
 	uint64_t uint64val;
-	ssize_t len;
+	NTSTATUS status;
 	int ret;
 
 	d = dalloc_new(mem_ctx);
@@ -209,23 +277,11 @@ NTSTATUS mdscli_blob_search(TALLOC_CTX *mem_ctx,
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	blob->spotlight_blob = talloc_array(d,
-					    uint8_t,
-					    ctx->max_fragment_size);
-	if (blob->spotlight_blob == NULL) {
-		TALLOC_FREE(d);
-		return NT_STATUS_NO_MEMORY;
-	}
-	blob->size = ctx->max_fragment_size;
-
-	len = sl_pack(d, (char *)blob->spotlight_blob, blob->size);


-- 
Samba Shared Repository



More information about the samba-cvs mailing list