The branch, v4-8-test has been updated
       via  7c476487867 vfs_ceph: remove ceph_fallocate/ceph_ftruncate fallback
       via  c539cf176a6 vfs_ceph: fix strict_allocate_ftruncate()
       via  cf279fbdd53 vfs_ceph: add missing fallocate hook
       via  03e4555f344 s3: smbd: filenames - ensure we replace the missing '/' 
if we error in an intermediate POSIX path.
       via  c249c88cdb7 s3: torture: Add additional POSIX mkdir tests.
       via  1ca055cb13b smbd: unix_convert: Ensure we don't call 
get_real_filename on POSIX paths.
       via  8d407971129 smbd: SMB1-POSIX: Add missing info-level 
SMB_POSIX_PATH_OPEN for UCF_UNIX_NAME_LOOKUP flag.
       via  3060221960b s3: smbtorture3: Add POSIX-MKDIR test for posix_mkdir 
case sensitive bug.
       via  89c3db2e9bb winbindd: set idmap cache entries as the last step in 
async wb_xids2sids
       via  29e16f4737c winbindd: track whether a result from xid2sid was 
coming from the cache
       via  447b0ad3a95 winbindd: switch send-next/done order
       via  19d06f27688 winbindd: update xid in wb_xids2sids_state->xids with 
what we got
       via  3197810fe1f winbindd: convert id to a pointer in 
wb_xids2sids_dom_done()
       via  8234ef264a7 winbindd: make xids a const argument to 
wb_xids2sids_send()
       via  a76277af385 winbindd: make a copy of xid's in wb_xids2sids_send()
       via  0f1525d430e messages_dgm: Properly handle receiver re-initialization
       via  e2b7d3ff627 torture3: Extend read3 for the "messaging target 
re-inits" failure
       via  069dd7189c1 messages_dgm: Use saved errno value
       via  1cb278ddaea notifyd: Fix SIGBUS on sparc
      from  8be2836cd82 PVE-2019-3824 ldb: Release ldb 1.3.8

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-8-test


- Log -----------------------------------------------------------------
commit 7c476487867e5dc83b9e844db7be4c3d358fc006
Author: David Disseldorp <dd...@samba.org>
Date:   Wed Feb 27 11:52:42 2019 +0100

    vfs_ceph: remove ceph_fallocate/ceph_ftruncate fallback
    
    Both libcephfs functions are supported and capable of extending files,
    so fallback can be dropped.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13807
    
    Signed-off-by: David Disseldorp <dd...@samba.org>
    Reviewed-by: Guenther Deschner <g...@samba.org>
    (cherry picked from commit 155f1289ba7a4802fbb99fbc9ea90d8bc6cff0c9)
    [dd...@samba.org: rebase atop 48t without 532ff3a5b958]
    
    Autobuild-User(v4-8-test): Karolin Seeger <ksee...@samba.org>
    Autobuild-Date(v4-8-test): Tue Mar  5 13:01:15 UTC 2019 on sn-devel-144

commit c539cf176a669e54ccddefa6b57a9285d12c93a9
Author: David Disseldorp <dd...@samba.org>
Date:   Tue Feb 26 16:07:27 2019 +0100

    vfs_ceph: fix strict_allocate_ftruncate()
    
    The vfs_ceph "strict allocate = yes" ftruncate wrapper may attempt
    *local* filesystem ftruncate(). Fix this.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13807
    
    Signed-off-by: David Disseldorp <dd...@samba.org>
    Reviewed-by: Guenther Deschner <g...@samba.org>
    (cherry picked from commit 70329c36ed91dd0e50ff66f9b0a85c62ac8a621e)

commit cf279fbdd531d4cab9cb0e6b8341e6cb1bbd9978
Author: David Disseldorp <dd...@samba.org>
Date:   Tue Feb 26 21:26:27 2019 +0100

    vfs_ceph: add missing fallocate hook
    
    SMB_VFS_FALLOCATE() calls atop a vfs_ceph share currently fall through
    to vfs_default, which results in a local filesystem I/O attempt using a
    libcephfs file-descriptor. Add the missing fallocate hook to vfs_ceph.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13807
    
    Signed-off-by: David Disseldorp <dd...@samba.org>
    Reviewed-by: Guenther Deschner <g...@samba.org>
    (cherry picked from commit 5a7e7280813559fb70a9fc8e4238cb6015ee3b53)

commit 03e4555f344e6806c80fefc8cf00a08d6ea2766e
Author: Jeremy Allison <j...@samba.org>
Date:   Sun Feb 24 08:15:23 2019 -0800

    s3: smbd: filenames - ensure we replace the missing '/' if we error in an 
intermediate POSIX path.
    
    Previous regression test ensures we still return the correct
    error code for POSIX pathname operations.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13803
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    
    Autobuild-User(master): Volker Lendecke <v...@samba.org>
    Autobuild-Date(master): Mon Feb 25 09:33:27 CET 2019 on sn-devel-144
    
    (cherry picked from commit 3f1a13a94a753c5cb3b9f2cf795df5adb0f74205)

commit c249c88cdb731026da04819e165717bb89278a42
Author: Jeremy Allison <j...@samba.org>
Date:   Sun Feb 24 08:03:32 2019 -0800

    s3: torture: Add additional POSIX mkdir tests.
    
    Ensure that if POSIX_foo exists as a file
    we return the correct error code NT_STATUS_OBJECT_PATH_NOT_FOUND
    if we try and traverse it as a directory.
    
    Also ensure creation/deletion of POSIX_foo/foo fails
    for directories and files with NT_STATUS_OBJECT_PATH_NOT_FOUND
    if the directory POSIX_foo/ doesn't exist.
    
    knownfail is back :-).
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13803
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    (cherry picked from commit 632d0db8c42d50f5eecd002d9573f739cd945960)

commit 1ca055cb13b750180e268714a34472225c773fec
Author: Jeremy Allison <j...@samba.org>
Date:   Sat Feb 23 12:24:31 2019 -0800

    smbd: unix_convert: Ensure we don't call get_real_filename on POSIX paths.
    
    For posix_pathnames don't blunder into the name_has_wildcard OR
    get_real_filename() codepaths as they may be doing case insensitive lookups.
    So when creating a new POSIX directory 'Foo' they might
    match on name 'foo'.
    
    Remove POSIX-MKDIR from knownfail.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13803
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    
    Autobuild-User(master): Volker Lendecke <v...@samba.org>
    Autobuild-Date(master): Sun Feb 24 14:04:14 CET 2019 on sn-devel-144
    
    (cherry picked from commit 12da33e2bbce657f25abe9bc4cb936ca4615b30f)

commit 8d407971129ae308c574c0d9dc7e0cfd7c7483b1
Author: Jeremy Allison <j...@samba.org>
Date:   Sat Feb 23 12:26:01 2019 -0800

    smbd: SMB1-POSIX: Add missing info-level SMB_POSIX_PATH_OPEN for 
UCF_UNIX_NAME_LOOKUP flag.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13803
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    (cherry picked from commit 980db8debde68f9edce13fc01bc45a904379cffd)

commit 3060221960b6d76a98f1a3eaf8afefe12a0fc717
Author: Jeremy Allison <j...@samba.org>
Date:   Sat Feb 23 17:52:34 2019 -0800

    s3: smbtorture3: Add POSIX-MKDIR test for posix_mkdir case sensitive bug.
    
    Test does:
    
    mkdir POSIX_foo
    mkdir POSIX_Foo
    mkdir POSIX_foo/Foo
    mkdir POSIX_foo/foo
    mkdir POSIX_Foo/Foo
    mkdir POSIX_Foo/foo
    
    Which should pass a SMB1 POSIX extensions server
    as posix mkdir should always be case sensitive
    no matter what the share is set to.
    
    Mark as knownfail for now.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13803
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    (cherry picked from commit f0decb31fff24ceb57d23bebbfb87aa0e5103947)

commit 89c3db2e9bbb39d3665db0f2eecd62f253771199
Author: Ralph Boehme <s...@samba.org>
Date:   Thu Feb 21 16:55:09 2019 +0100

    winbindd: set idmap cache entries as the last step in async wb_xids2sids
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13802
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    
    Autobuild-User(master): Volker Lendecke <v...@samba.org>
    Autobuild-Date(master): Sat Feb 23 09:23:22 CET 2019 on sn-devel-144
    
    (cherry picked from commit 9b9565c3e69b92c298c7168e516387bb249c9e36)

commit 29e16f4737c6e955a18bc1130d06dcf17b7cb0d1
Author: Ralph Boehme <s...@samba.org>
Date:   Fri Feb 22 11:00:00 2019 +0100

    winbindd: track whether a result from xid2sid was coming from the cache
    
    This is needed in preparation of moving the step to update the idmap
    cache from the per-idmap-domain callback wb_xids2sids_dom_done() to the
    top-level callback wb_xids2sids_done().
    
    Currently the sequence of action is:
    
    * check cache, if not found:
      * ask backends
      * cache result from backend
    * return results
    
    Iow, if we got something from the cache, we don't write the cache.
    
    The next commit defers updating the cache to the top-level callback, so
    the sequence becomes
    
    * check cache, if not found:
      * ask backends
    * cache results
    * return results
    
    This has two problems:
    
    * it needlessly writes to the cache what we just got from it
    
    * it possibly overwrites the ID_TYPE_BOTH for a SID-to-xid mapping in
      the following case:
    
      - existing ID_TYPE_BOTH mapping in the cache, eg:
    
        IDMAP/SID2XID/S-1-5-21-2180672342-2513613279-2566592647-512 -> Value: 
3000000:B
    
      - someone calls wb_xids2sids_send() with 
xid.id=3000000,xid.type=ID_TYPE_GID
    
      - cache lookup with idmap_cache_find_gid2sid() succeeds
    
      - when caching results we'd call idmap_cache_set_sid2unixid() with the
        callers xid.type=ID_TYPE_GID, so idmap_cache_set_sid2unixid() will
        overwrite the SID-to-xid mapping with ID_TYPE_GID
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13802
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    (cherry picked from commit 62f54229fced20102e11ad1da02faef45c2a7c2e)

commit 447b0ad3a956909d72ce9de6cfa60f34ae23b437
Author: Ralph Boehme <s...@samba.org>
Date:   Thu Feb 21 16:52:21 2019 +0100

    winbindd: switch send-next/done order
    
    In preparation of adding more logic to the done step. No change in
    behaviour.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13802
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    (cherry picked from commit 8e9c2a1f6ceb06d695a6572701b96a3e3821ac42)

commit 19d06f27688b0931624911d15d26dbabaa39deb1
Author: Ralph Boehme <s...@samba.org>
Date:   Thu Feb 21 18:40:20 2019 +0100

    winbindd: update xid in wb_xids2sids_state->xids with what we got
    
    In preparation of priming the idmap cache in the top-level
    wb_xids2sids_done(), not in the per-idmap-domain callback
    wb_xids2sids_dom_done().
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13802
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    (cherry picked from commit 7f23ef7b2cf7bd6e8dc087aa15137292b421a689)

commit 3197810fe1f2675afdb2b7b7e863c0f05cc26370
Author: Ralph Boehme <s...@samba.org>
Date:   Thu Feb 21 18:39:46 2019 +0100

    winbindd: convert id to a pointer in wb_xids2sids_dom_done()
    
    No change in behaviour.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13802
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    (cherry picked from commit f8bf4fc608639695651f75c52b31f95e796a5a26)

commit 8234ef264a7d9344b412a0b2b36dc4c6b47876e4
Author: Ralph Boehme <s...@samba.org>
Date:   Fri Feb 22 16:29:07 2019 +0100

    winbindd: make xids a const argument to wb_xids2sids_send()
    
    The previous commit made an internal copy of xids, this commit makes it
    more obvious that we must not mess with the xids argument but treat it as
    an in-parameter and don't write to it.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13802
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    (cherry picked from commit 5d277ea7ea258676b9ea5081a451a5874af115f6)

commit a76277af385b10518dccf83ccb1b49173d625881
Author: Ralph Boehme <s...@samba.org>
Date:   Thu Feb 21 18:34:51 2019 +0100

    winbindd: make a copy of xid's in wb_xids2sids_send()
    
    This is in preparation of setting the result of the mapping in the top-
    level callback wb_xids2sids_done(), not in the per-idmap-domain callback
    wb_xids2sids_dom_done().
    
    When caching the mapping we need the id-type from the backend, so we
    need a way to pass up that information from wb_xids2sids_dom_done() up
    to wb_xids2sids_done()
    
    The xids array copy gets passed from wb_xids2sids_send() to
    wb_xids2sids_dom_send(), so wb_xids2sids_dom_done() can then directly
    update the top-level copy.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13802
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    (cherry picked from commit f5a8bc2f945be45cdade5f70d4f975bae8337f67)

commit 0f1525d430ec4975952520b00cbd4c5e49f9b097
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Feb 7 16:15:46 2019 +0100

    messages_dgm: Properly handle receiver re-initialization
    
    This only properly covers the small-message nonblocking case. Covering
    the large-message and the blocking case is a much larger effort assuming
    we want to re-send the failed message if parts of the message has gone
    through properly. Don't do that for now.
    
    This was found by sanba_dnsupdate constantly recreating its irpc handle to
    winbindd in the RODC case.
    
    The messaging_dgm code cached connected datagram sockets based on the
    destination pid for 1 second. Which means the IRPC responses from
    winbindd are never delivered to samba_dnsupdate,
    which will then hit a timeout.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13786
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>
    (cherry picked from commit 2543bba0364d8054e9ad316f5611621841bc061d)

commit e2b7d3ff62745c1205a36b296e9371636950cc85
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Feb 7 17:48:34 2019 +0100

    torture3: Extend read3 for the "messaging target re-inits" failure
    
    Do ping_pong a hundred times, re-initializing the msg_ctx every time.
    
    https://bugzilla.samba.org/show_bug.cgi?id=13786
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>
    (cherry picked from commit 8d8f62c4b9dea381ce9f5833bc794553ae358173)

commit 069dd7189c10ba5ffdbe5f70f91a11ba4e55981f
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Feb 7 15:57:06 2019 +0100

    messages_dgm: Use saved errno value
    
    In this case this is just a cleanup, the value has just been set by
    messaging_dgm_sendmsg. But as that already saves errno into a local
    variable, use that.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13786
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>
    (cherry picked from commit c27afc098398274abaed6dc9bef2019091c1b635)

commit 1cb278ddaea03c946ed9f32665517ffaec833823
Author: Jiří Šašek <jiri.sa...@oracle.com>
Date:   Thu Dec 6 14:10:53 2018 +0100

    notifyd: Fix SIGBUS on sparc
    
    Problem is the structure "struct notify_instance" can lay in message buffer 
on
    address not dividable by 8 but this structure begins by uint_64 (secs in
    time-stamp). Structure should be re-packed to standalone buffer before the 
use.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=13704
    Signed-off-by: jiri.sa...@oracle.com
    Reviewed-by: Volker Lendecke <v...@samba.org>

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

Summary of changes:
 selftest/skip                         |   1 +
 source3/lib/messages_dgm.c            |  18 ++-
 source3/modules/vfs_ceph.c            | 117 +++++---------------
 source3/selftest/tests.py             |   2 +-
 source3/smbd/filename.c               |  43 ++++++++
 source3/smbd/notifyd/notifyd.c        |  11 +-
 source3/smbd/trans2.c                 |   1 +
 source3/torture/test_messaging_read.c |  44 ++++----
 source3/torture/torture.c             | 202 ++++++++++++++++++++++++++++++++++
 source3/winbindd/wb_xids2sids.c       |  74 +++++++++----
 source3/winbindd/winbindd_proto.h     |   2 +-
 11 files changed, 375 insertions(+), 140 deletions(-)


Changeset truncated at 500 lines:

diff --git a/selftest/skip b/selftest/skip
index dd60ab5a1fb..4d6648f3369 100644
--- a/selftest/skip
+++ b/selftest/skip
@@ -48,6 +48,7 @@
 ^samba3.smbtorture_s3.plain\(ad_dc_ntvfs\).POSIX-SYMLINK-EA # Fails against 
the s4 ntvfs server
 ^samba3.smbtorture_s3.plain\(ad_dc_ntvfs\).POSIX-OFD-LOCK # Fails against the 
s4 ntvfs server
 ^samba3.smbtorture_s3.plain\(ad_dc_ntvfs\).POSIX-STREAM-DELETE # Fails against 
the s4 ntvfs server
+^samba3.smbtorture_s3.plain\(ad_dc_ntvfs\).POSIX-MKDIR # Fails against the s4 
ntvfs server
 ^samba3.smbtorture_s3.plain\(ad_dc_ntvfs\).WINDOWS-BAD-SYMLINK # Fails against 
the s4 ntvfs server
 ^samba3.smbtorture_s3.plain\(ad_dc_ntvfs\).RENAME-ACCESS # Fails against the 
s4 ntvfs server
 ^samba3.smbtorture_s3.plain\(ad_dc_ntvfs\).OWNER-RIGHTS # Don't test against 
the s4 ntvfs server anymore
diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index b9cddc274c2..2fd63008b69 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -553,7 +553,7 @@ static void messaging_dgm_out_threaded_job(void 
*private_data)
                if (state->sent != -1) {
                        return;
                }
-               if (errno != ENOBUFS) {
+               if (state->err != ENOBUFS) {
                        return;
                }
 
@@ -1415,6 +1415,7 @@ int messaging_dgm_send(pid_t pid,
        struct messaging_dgm_context *ctx = global_dgm_context;
        struct messaging_dgm_out *out;
        int ret;
+       unsigned retries = 0;
 
        if (ctx == NULL) {
                return ENOTCONN;
@@ -1422,6 +1423,7 @@ int messaging_dgm_send(pid_t pid,
 
        messaging_dgm_validate(ctx);
 
+again:
        ret = messaging_dgm_out_get(ctx, pid, &out);
        if (ret != 0) {
                return ret;
@@ -1431,6 +1433,20 @@ int messaging_dgm_send(pid_t pid,
 
        ret = messaging_dgm_out_send_fragmented(ctx->ev, out, iov, iovlen,
                                                fds, num_fds);
+       if (ret == ECONNREFUSED) {
+               /*
+                * We cache outgoing sockets. If the receiver has
+                * closed and re-opened the socket since our last
+                * message, we get connection refused. Retry.
+                */
+
+               TALLOC_FREE(out);
+
+               if (retries < 5) {
+                       retries += 1;
+                       goto again;
+               }
+       }
        return ret;
 }
 
diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c
index b6707458b77..5d67142997d 100644
--- a/source3/modules/vfs_ceph.c
+++ b/source3/modules/vfs_ceph.c
@@ -1124,9 +1124,7 @@ static struct smb_filename *cephwrap_getwd(struct 
vfs_handle_struct *handle,
 static int strict_allocate_ftruncate(struct vfs_handle_struct *handle, 
files_struct *fsp, off_t len)
 {
        off_t space_to_write;
-       uint64_t space_avail;
-       uint64_t bsize,dfree,dsize;
-       int ret;
+       int result;
        NTSTATUS status;
        SMB_STRUCT_STAT *pst;
 
@@ -1145,111 +1143,45 @@ static int strict_allocate_ftruncate(struct 
vfs_handle_struct *handle, files_str
                return 0;
 
        /* Shrink - just ftruncate. */
-       if (pst->st_ex_size > len)
-               return ftruncate(fsp->fh->fd, len);
-
-       space_to_write = len - pst->st_ex_size;
-
-       /* for allocation try fallocate first. This can fail on some
-          platforms e.g. when the filesystem doesn't support it and no
-          emulation is being done by the libc (like on AIX with JFS1). In that
-          case we do our own emulation. fallocate implementations can
-          return ENOTSUP or EINVAL in cases like that. */
-       ret = SMB_VFS_FALLOCATE(fsp, 0, pst->st_ex_size, space_to_write);
-       if (ret == -1 && errno == ENOSPC) {
-               return -1;
-       }
-       if (ret == 0) {
-               return 0;
-       }
-       DEBUG(10,("[CEPH] strict_allocate_ftruncate: SMB_VFS_FALLOCATE failed 
with "
-               "error %d. Falling back to slow manual allocation\n", errno));
-
-       /* available disk space is enough or not? */
-       space_avail =
-           get_dfree_info(fsp->conn, fsp->fsp_name, &bsize, &dfree, &dsize);
-       /* space_avail is 1k blocks */
-       if (space_avail == (uint64_t)-1 ||
-                       ((uint64_t)space_to_write/1024 > space_avail) ) {
-               errno = ENOSPC;
-               return -1;
+       if (pst->st_ex_size > len) {
+               result = ceph_ftruncate(handle->data, fsp->fh->fd, len);
+               WRAP_RETURN(result);
        }
 
-       /* Write out the real space on disk. */
-       return vfs_slow_fallocate(fsp, pst->st_ex_size, space_to_write);
+       space_to_write = len - pst->st_ex_size;
+       result = ceph_fallocate(handle->data, fsp->fh->fd, 0, pst->st_ex_size,
+                               space_to_write);
+       WRAP_RETURN(result);
 }
 
 static int cephwrap_ftruncate(struct vfs_handle_struct *handle, files_struct 
*fsp, off_t len)
 {
        int result = -1;
-       SMB_STRUCT_STAT st;
-       char c = 0;
-       off_t currpos;
 
        DBG_DEBUG("[CEPH] ftruncate(%p, %p, %llu\n", handle, fsp, llu(len));
 
        if (lp_strict_allocate(SNUM(fsp->conn))) {
-               result = strict_allocate_ftruncate(handle, fsp, len);
-               return result;
+               return strict_allocate_ftruncate(handle, fsp, len);
        }
 
-       /* we used to just check HAVE_FTRUNCATE_EXTEND and only use
-          sys_ftruncate if the system supports it. Then I discovered that
-          you can have some filesystems that support ftruncate
-          expansion and some that don't! On Linux fat can't do
-          ftruncate extend but ext2 can. */
-
        result = ceph_ftruncate(handle->data, fsp->fh->fd, len);
-       if (result == 0)
-               goto done;
-
-       /* According to W. R. Stevens advanced UNIX prog. Pure 4.3 BSD cannot
-          extend a file with ftruncate. Provide alternate implementation
-          for this */
-       currpos = SMB_VFS_LSEEK(fsp, 0, SEEK_CUR);
-       if (currpos == -1) {
-               goto done;
-       }
-
-       /* Do an fstat to see if the file is longer than the requested
-          size in which case the ftruncate above should have
-          succeeded or shorter, in which case seek to len - 1 and
-          write 1 byte of zero */
-       if (SMB_VFS_FSTAT(fsp, &st) == -1) {
-               goto done;
-       }
-
-#ifdef S_ISFIFO
-       if (S_ISFIFO(st.st_ex_mode)) {
-               result = 0;
-               goto done;
-       }
-#endif
-
-       if (st.st_ex_size == len) {
-               result = 0;
-               goto done;
-       }
-
-       if (st.st_ex_size > len) {
-               /* the sys_ftruncate should have worked */
-               goto done;
-       }
-
-       if (SMB_VFS_LSEEK(fsp, len-1, SEEK_SET) != len -1)
-               goto done;
-
-       if (SMB_VFS_WRITE(fsp, &c, 1)!=1)
-               goto done;
-
-       /* Seek to where we were */
-       if (SMB_VFS_LSEEK(fsp, currpos, SEEK_SET) != currpos)
-               goto done;
-       result = 0;
+       WRAP_RETURN(result);
+}
 
-  done:
+static int cephwrap_fallocate(struct vfs_handle_struct *handle,
+                             struct files_struct *fsp,
+                             uint32_t mode,
+                             off_t offset,
+                             off_t len)
+{
+       int result;
 
-       return result;
+       DBG_DEBUG("[CEPH] fallocate(%p, %p, %u, %llu, %llu\n",
+                 handle, fsp, mode, llu(offset), llu(len));
+       /* unsupported mode flags are rejected by libcephfs */
+       result = ceph_fallocate(handle->data, fsp->fh->fd, mode, offset, len);
+       DBG_DEBUG("[CEPH] fallocate(...) = %d\n", result);
+       WRAP_RETURN(result);
 }
 
 static bool cephwrap_lock(struct vfs_handle_struct *handle, files_struct *fsp, 
int op, off_t offset, off_t count, int type)
@@ -1613,6 +1545,7 @@ static struct vfs_fn_pointers ceph_fns = {
        .getwd_fn = cephwrap_getwd,
        .ntimes_fn = cephwrap_ntimes,
        .ftruncate_fn = cephwrap_ftruncate,
+       .fallocate_fn = cephwrap_fallocate,
        .lock_fn = cephwrap_lock,
        .kernel_flock_fn = cephwrap_kernel_flock,
        .linux_setlease_fn = cephwrap_linux_setlease,
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 0625c7e924e..e5433a55118 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -117,7 +117,7 @@ for t in tests:
     plantestsuite("samba3.smbtorture_s3.vfs_aio_fork(simpleserver).%s" % t, 
"simpleserver", [os.path.join(samba3srcdir, 
"script/tests/test_smbtorture_s3.sh"), t, '//$SERVER_IP/vfs_aio_fork', 
'$USERNAME', '$PASSWORD', smbtorture3, "", "-l $LOCAL_PATH"])
 
 posix_tests = ["POSIX", "POSIX-APPEND", "POSIX-SYMLINK-ACL", 
"POSIX-SYMLINK-EA", "POSIX-OFD-LOCK",
-              "POSIX-STREAM-DELETE", "WINDOWS-BAD-SYMLINK" ]
+              "POSIX-STREAM-DELETE", "WINDOWS-BAD-SYMLINK", "POSIX-MKDIR" ]
 
 for t in posix_tests:
     plantestsuite("samba3.smbtorture_s3.plain(nt4_dc).%s" % t, "nt4_dc", 
[os.path.join(samba3srcdir, "script/tests/test_smbtorture_s3.sh"), t, 
'//$SERVER_IP/posix_share', '$USERNAME', '$PASSWORD', smbtorture3, "", "-l 
$LOCAL_PATH"])
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index ede14b95e79..8a00fbb06e7 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -906,6 +906,49 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx,
                        /* Stat failed - ensure we don't use it. */
                        SET_STAT_INVALID(smb_fname->st);
 
+                       if (posix_pathnames) {
+                               /*
+                                * For posix_pathnames, we're done.
+                                * Don't blunder into the name_has_wildcard OR
+                                * get_real_filename() codepaths as they may
+                                * be doing case insensitive lookups. So when
+                                * creating a new POSIX directory Foo they might
+                                * match on name foo.
+                                *
+                                * BUG: 
https://bugzilla.samba.org/show_bug.cgi?id=13803
+                                */
+                               if (end != NULL) {
+                                       const char *morepath = NULL;
+                                       /*
+                                        * If this is intermediate we must
+                                        * restore the full path.
+                                        */
+                                       *end = '/';
+                                       /*
+                                        * If there are any more components
+                                        * after the failed LSTAT we cannot
+                                        * continue.
+                                        */
+                                       morepath = strchr(end + 1, '/');
+                                       if (morepath != NULL) {
+                                               status = 
NT_STATUS_OBJECT_PATH_NOT_FOUND;
+                                               goto fail;
+                                       }
+                               }
+                               if (errno == ENOENT) {
+                                       /* New file or directory. */
+                                       goto done;
+                               }
+                               if ((errno == EACCES) &&
+                                   (ucf_flags & UCF_PREP_CREATEFILE)) {
+                                       /* POSIX Dropbox case. */
+                                       errno = 0;
+                                       goto done;
+                               }
+                               status = map_nt_error_from_unix(errno);
+                               goto fail;
+                       }
+
                        /*
                         * Reset errno so we can detect
                         * directory open errors.
diff --git a/source3/smbd/notifyd/notifyd.c b/source3/smbd/notifyd/notifyd.c
index e4e5c785472..4fcef508a91 100644
--- a/source3/smbd/notifyd/notifyd.c
+++ b/source3/smbd/notifyd/notifyd.c
@@ -575,6 +575,7 @@ static void notifyd_rec_change(struct messaging_context 
*msg_ctx,
        struct notify_rec_change_msg *msg;
        size_t pathlen;
        bool ok;
+       struct notify_instance instance;
 
        DBG_DEBUG("Got %zu bytes from %s\n", data->length,
                  server_id_str_buf(src, &idbuf));
@@ -585,8 +586,10 @@ static void notifyd_rec_change(struct messaging_context 
*msg_ctx,
                return;
        }
 
+       memcpy(&instance, &msg->instance, sizeof(instance)); /* avoid SIGBUS */
+
        ok = notifyd_apply_rec_change(
-               &src, msg->path, pathlen, &msg->instance,
+               &src, msg->path, pathlen, &instance,
                state->entries, state->sys_notify_watch, state->sys_notify_ctx,
                state->msg_ctx);
        if (!ok) {
@@ -1337,6 +1340,7 @@ static void notifyd_apply_reclog(struct notifyd_peer 
*peer,
                struct notify_rec_change_msg *chg;
                size_t pathlen;
                bool ok;
+               struct notify_instance instance;
 
                ok = notifyd_parse_rec_change(r->buf.data, r->buf.length,
                                              &chg, &pathlen);
@@ -1346,8 +1350,11 @@ static void notifyd_apply_reclog(struct notifyd_peer 
*peer,
                        goto fail;
                }
 
+               /* avoid SIGBUS */
+               memcpy(&instance, &chg->instance, sizeof(instance));
+
                ok = notifyd_apply_rec_change(&r->src, chg->path, pathlen,
-                                             &chg->instance, peer->db,
+                                             &instance, peer->db,
                                              state->sys_notify_watch,
                                              state->sys_notify_ctx,
                                              state->msg_ctx);
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index bb20ebeec86..a2dbf344bb7 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -8829,6 +8829,7 @@ static void call_trans2setfilepathinfo(connection_struct 
*conn,
                if (info_level == SMB_SET_FILE_UNIX_BASIC ||
                                info_level == SMB_SET_FILE_UNIX_INFO2 ||
                                info_level == SMB_FILE_RENAME_INFORMATION ||
+                               info_level == SMB_POSIX_PATH_OPEN ||
                                info_level == SMB_POSIX_PATH_UNLINK) {
                        ucf_flags |= UCF_UNIX_NAME_LOOKUP;
                }
diff --git a/source3/torture/test_messaging_read.c 
b/source3/torture/test_messaging_read.c
index d3e4079074b..555f084c040 100644
--- a/source3/torture/test_messaging_read.c
+++ b/source3/torture/test_messaging_read.c
@@ -250,14 +250,13 @@ fail:
 }
 
 struct msg_pingpong_state {
-       uint8_t dummy;
+       struct messaging_context *msg_ctx;
 };
 
 static void msg_pingpong_done(struct tevent_req *subreq);
 
 static struct tevent_req *msg_pingpong_send(TALLOC_CTX *mem_ctx,
                                            struct tevent_context *ev,
-                                           struct messaging_context *msg_ctx,
                                            struct server_id dst)
 {
        struct tevent_req *req, *subreq;
@@ -269,13 +268,23 @@ static struct tevent_req *msg_pingpong_send(TALLOC_CTX 
*mem_ctx,
                return NULL;
        }
 
-       status = messaging_send_buf(msg_ctx, dst, MSG_PING, NULL, 0);
+       if (!tevent_req_set_endtime(req, ev, timeval_current_ofs(10, 0))) {
+               return tevent_req_post(req, ev);
+       }
+
+       state->msg_ctx = messaging_init(state, ev);
+       if (tevent_req_nomem(state->msg_ctx, req)) {
+               return tevent_req_post(req, ev);
+       }
+
+       status = messaging_send_buf(state->msg_ctx, dst, MSG_PING, NULL, 0);
        if (!NT_STATUS_IS_OK(status)) {
+               DBG_DEBUG("messaging_send_buf failed: %s\n", nt_errstr(status));
                tevent_req_error(req, map_errno_from_nt_status(status));
                return tevent_req_post(req, ev);
        }
 
-       subreq = messaging_read_send(state, ev, msg_ctx, MSG_PONG);
+       subreq = messaging_read_send(state, ev, state->msg_ctx, MSG_PONG);
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
        }
@@ -308,18 +317,17 @@ static int msg_pingpong_recv(struct tevent_req *req)
        return 0;
 }
 
-static int msg_pingpong(struct messaging_context *msg_ctx,
-                       struct server_id dst)
+static int msg_pingpong(struct server_id dst)
 {
        struct tevent_context *ev;
        struct tevent_req *req;
        int ret = ENOMEM;
 
-       ev = tevent_context_init(msg_ctx);
+       ev = tevent_context_init(talloc_tos());
        if (ev == NULL) {
                goto fail;
        }
-       req = msg_pingpong_send(ev, ev, msg_ctx, dst);
+       req = msg_pingpong_send(ev, ev, dst);
        if (req == NULL) {
                goto fail;
        }
@@ -398,7 +406,7 @@ bool run_messaging_read3(int dummy)
        pid_t child;
        int ready_pipe[2];
        int exit_pipe[2];
-       int ret;
+       int i, ret;
        char c;
        struct server_id dst;
        ssize_t written;
@@ -433,19 +441,15 @@ bool run_messaging_read3(int dummy)
                fprintf(stderr, "tevent_context_init failed\n");
                goto fail;
        }
-       msg_ctx = messaging_init(ev, ev);
-       if (msg_ctx == NULL) {
-               fprintf(stderr, "messaging_init failed\n");
-               goto fail;
-       }
 
-       dst = messaging_server_id(msg_ctx);
-       dst.pid = child;
+       dst = (struct server_id){ .pid = child, .vnn = NONCLUSTER_VNN, };
 
-       ret = msg_pingpong(msg_ctx, dst);
-       if (ret != 0){
-               fprintf(stderr, "msg_pingpong failed\n");
-               goto fail;
+       for (i=0; i<100; i++) {
+               ret = msg_pingpong(dst);
+               if (ret != 0){
+                       fprintf(stderr, "msg_pingpong failed\n");
+                       goto fail;
+               }
        }
 
        printf("Parent: telling child to exit\n");
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index ed7390a47a7..206cc860e5a 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -7254,6 +7254,207 @@ static bool run_posix_ofd_lock_test(int dummy)
        return correct;
 }
 
+/*
+  Test POSIX mkdir is case-sensitive.
+ */
+static bool run_posix_mkdir_test(int dummy)
+{
+       static struct cli_state *cli;
+       const char *fname_foo = "POSIX_foo";
+       const char *fname_foo_Foo = "POSIX_foo/Foo";
+       const char *fname_foo_foo = "POSIX_foo/foo";
+       const char *fname_Foo = "POSIX_Foo";
+       const char *fname_Foo_Foo = "POSIX_Foo/Foo";
+       const char *fname_Foo_foo = "POSIX_Foo/foo";
+       bool correct = false;
+       NTSTATUS status;
+       TALLOC_CTX *frame = NULL;
+       uint16_t fnum = (uint16_t)-1;
+
+       frame = talloc_stackframe();
+
+       printf("Starting POSIX mkdir test\n");
+
+       if (!torture_open_connection(&cli, 0)) {
+               TALLOC_FREE(frame);
+               return false;
+       }
+
+       smbXcli_conn_set_sockopt(cli->conn, sockops);
+
+       status = torture_setup_unix_extensions(cli);
+       if (!NT_STATUS_IS_OK(status)) {
+               TALLOC_FREE(frame);
+               return false;
+       }
+
+       cli_posix_rmdir(cli, fname_foo_foo);
+       cli_posix_rmdir(cli, fname_foo_Foo);
+       cli_posix_rmdir(cli, fname_foo);
+
+       cli_posix_rmdir(cli, fname_Foo_foo);
+       cli_posix_rmdir(cli, fname_Foo_Foo);
+       cli_posix_rmdir(cli, fname_Foo);
+
+       /*
+        * Create a file POSIX_foo then try


-- 
Samba Shared Repository

Reply via email to